暴力大法好,得到一个经验,将思路写成流程图会更加清晰。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
using namespace std;
const int maxn=1e4+5;
const int inf=0x3f3f3f3f;
int num[maxn];
int n,k,sum,res,rat;
int four;
int cnt[10];
void solve()
{
if(four==0)
rat=cnt[1];
else if(four>0)
{
if(cnt[2]>2*n+four)
{
cnt[1]+=(cnt[2]-(2*n+four))*2;
rat=cnt[1];
}
else
{
rat=cnt[1];
}
}
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n==0)
break;
sum=0;
four=0;
cnt[0]=cnt[1]=cnt[2]=cnt[3]=0;
for(int i=0; i<k; ++i)
{
scanf("%d",&num[i]);
sum+=num[i];
cnt[num[i]%4]++;
four+=(num[i]/4);
}
res=n*8-sum;
/**if(res>=k)
{
printf("YES\n");
continue;
}**/
if(four>=n)
four=0;
else
four=n-four;
cnt[2]+=cnt[3];
cnt[1]+=cnt[3];
solve();
if(res>=rat)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
思路如下图所示:
将3转化为2和1的思路来自于一位大佬的博客