CodeForces 839B. Game of the Rows 贪心

题目传送门

注意点:2 7 2 2 2 2 2 2 2这个样例的排列可以是下图这种形式,结果是YES。我就是被这个点卡了好几个小时。

AA BBOC DD

EE 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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值