题目
飞机每行座位如上图所示,共n(n<=1e4)行座位,
k(k<=100)个国家乘客,第i个国家ai(ai<=1e4)人,保证总和<=8n,
现在要求不同国家的不相邻,问是否存在可行方案
题解
水题,只是单纯地想写一波博客总结一下……
印象里10月有个学弟问过这个题,当时自己口胡了一下没做,
今天WA了四发,才觉得这个贪心思维题有点费劲……
注意把没能匹配成4的中间座位拆成2+1,再把没能匹配2的两边座位拆成1
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,k,v,a[5],four,two,one,mn;
bool ok()
{
a[2]+=a[3];a[1]+=a[3];//3=2+1 不考虑3
mn=min(a[4],four);four-=mn;a[4]-=mn;//优先放满4
a[2]+=2*a[4];//把4人拆成2+2
two+=four;one+=four;//把4座拆成2+1
mn=min(a[2],two);two-=mn;a[2]-=mn;
a[1]+=2*a[2];//把2人拆成1+1
one+=two;//把2座拆成1
return one>=a[1];
}
int main()
{
scanf("%d%d",&n,&k);
four=n;two=2*n;
for(int i=1;i<=k;++i)
{
scanf("%d",&v);
a[4]+=v/4;
if(v%4)a[v%4]++;
}
puts(ok()?"YES":"NO");
return 0;
}