注意点:2 7 2 2 2 2 2 2 2这个样例的排列可以是下图这种形式,结果是YES。我就是被这个点卡了好几个小时。
AA BBOC DDEE FFOC GG
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,k,x;
cin >> n >> k;
int sum2 = n*2,sum4 = n; //双人座和四人座数量
int x1 = 0,x2 = 0,x3 = 0,x4 = 0; //每种组合的数量
for(int i=1;i<=k;i++) {
cin >> x;
x4 += x/4; //四人组合
if(x%4==3) x3 ++; //三人小组
if(x%4==2) x2 ++; //二人小组
if(x%4==1) x1 ++; //单身狗
}
while(sum4>0 && x4>0) {sum4--;x4--;} //三四人组合优先分配四连座
while(sum4>0 && x3>0) {sum4--;x3--;}
while(sum4>0 && x2>0) {sum4--;x2--;x1--;} //二人组合在分配四连座时可以带走一个单身狗
while(sum4>0 && x1>0) {sum4--;x1--;sum2++;} //单身狗在分配四连座时产生一个空的双人座
//华丽分割线:x1可能变负数,表示还能容纳的单身狗数量
//下面同理,主要是四人座的优先分配思想(贪心),以达到尽量多地使用座位
while(sum2>1 && x4>0) {sum2-=2;x4--;}
while(sum2>1 && x3>0) {sum2-=2;x3--;}
while(sum2>0 && x2>0) {sum2--;x2--;}
while(sum2>0 && x1>0) {sum2--;x1--;}
if(x2*2+x3*3+x4*4+x1<=0) //计算没有二人座和四人座情况下单身狗够不够座位
cout << "YES" << endl;
else if(x1<=0 && x2<=0 && x3<=0 && x4<=0) //全部人都得到座位
cout << "YES" << endl;
else cout << "NO" << endl;
return 0;
}