猿辅导(8/24)
题目二:
这个题目的样例给的有点迷惑人心。牛客上一堆0的,我也是调了好久都是0。最初的想法是给人数排序,然后选最多人数的三个角色,贪心的把其中最小的那个直接作为一个组数,然后再排序,依然选择最多人数的三个角色,直到最多人数的前三名有0为止。
大概如下所示:
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int c;
cin>>c;
vector<int> res;
for(int i=0;i<c;i++)
{
int t;
cin>>t;
vector<int> vt;
int num;
for(int j=0;j<t;j++)
{
cin>>num;
vt.push_back(num);
}
int cnt=0;
sort(vt.begin(),vt.end(),cmp);
for(int k=0;k+2<vt.size();)
{
if(vt[k]==0||vt[k+1]==0||vt[k+2]==0)
break;
cnt+=vt[k+2];
vt[k]-=vt[k+2];
vt[k+1]-=vt[k+2];
vt[k+2]=0;
sort(vt.begin(),vt.end(),cmp);
}
res.push_back(cnt);
}
for(int i=0;i<res.size();i++)
{
if(i==res.size()-1)
cout<<res[i];
else
cout<<res[i]<<endl;
}
return 0;
}
给的样例都通过了,但就是通过率是0。
牛课上有人举例2 3 3 99,按照我上边的思路是2+1=3
但其实如果每次都不贪心,并不一次就选最大三数中最小的那个数,而只选择1个,就是1+1+1+1=4了。
int cnt=0;
sort(vt.begin(),vt.end(),cmp);
for(int k=0;k+2<vt.size();)
{
if(vt[k]==0||vt[k+1]==0||vt[k+2]==0)
break;
cnt+=1;
vt[k]-=1;
vt[k+1]-=1;
vt[k+2]-=1;
sort(vt.begin(),vt.end(),cmp);
}
res.push_back(cnt);
有点担心会不会超时,因为要排序,但是基本有序的数组其实还好。
题目三:
没有思路。。。