传送门
//比赛的时候看错题了, 以为是相邻的座位要是不同的组来做, 关键是这样想还都能过样例. mmm.
//下来就把它补了. 既然要相邻的座位要是同一组的人做. 那么就只有4+2+1的做法. 所以我们就把数都分解成这种形式就OK了, (注意34也是算挨着的), 还要注意在算下一种做法时要加上之前的做法, 比如做2的时候, 要把剩余做4的再加上, 因为4的不能连续做两个的, 所以直接加上就好了. 最后做1的时候再加上之前做2,4,的剩余就好, 最后判断是否剩余>=0, 是就是YES, or NO.
AC Code
/** @Cain*/
int a[105];
void solve()
{
int n,k;
while(~scanf("%d%d",&n,&k)){
for(int i = 0;i<k;i++){
scanf("%d",&a[i]);
}
int sum1 = n; //一行做1个4个的.
int sum2 = 2*n; //一行做2个2个的.
for(int i = 0;i<k;i++){
int d = min(sum1,a[i]/4);
sum1 -= d;
a[i] -= d*4;
}
sum2+=sum1; //4个的不能连着做2个2个的.
for(int i = 0;i<k;i++){
int d = min(sum2,a[i]/2);
sum2 -= d;
a[i] -= d*2;
}
int tmp = sum2+sum1; //一个的只能分开做.
for(int i = 0;i<k;i++){
tmp -= a[i];
}
if(tmp>=0) puts("YES");
else puts("NO");
}
}