Codeforces Round #428 (Div. 2) B.Game of the Rows(思维题/贪心)

题目

飞机每行座位如上图所示,共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;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code92007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值