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

题意很简单了,给n个部队的士兵安排飞机座位,使得不同部队的士兵不会坐在邻座,如图所示, {1, 2}, {3, 4}, {4, 5}, {5, 6} {7, 8}都是邻座。给出部队数和每个部队的人数以及飞机座位的排数,问有没有合法的方案。

这里写图片描述

重点应该就是{4,5}这个座位也是相邻的,所以安排位置要有策略.
1.每个部队有4人以上的,每4人安排到中间的四个座位上(直到没有中间的座位或安排完)
2.每个部队剩余的大于2人以上的,每两人安排到一个两侧的座椅对上(直到安排完或者座位用完)
3.每个部队中若还有剩余的2人以上的,每两人安排到中间的4座中的一排中(两队不能邻座,所以一队坐一排的左边两个或者右边两个)。(直到中间排用完或者安排完)
4.若还有部队有剩余两人以上的,就得拆开坐在上一步使用的4座中的没被坐的座椅对的靠走道的位置。
5.每个部队剩余单人也是得1人占用一个座椅对。

以如上方式安排,若能安排完则YES,否则NO。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n, k;
int a[105];
int need[105];
int main(){
    int dan = 0;//每个部队剩余的单人
    bool f = 1;
    scanf("%d%d",&n, &k);
    int zhong = n;//中间4座的数量
    for (int i = 0; i < k; i++){
        scanf("%d", &a[i]);
        need[i] = a[i] / 2;
        if (a[i] % 2)dan++;
        int kk = need[i] / 2;
        if (zhong >= kk){
            need[i] -= kk * 2;
            zhong -= kk;
        }
        else{
            need[i] -= zhong * 2;
            zhong = 0;
        }
    }
    int lef = 2*n;//两边剩余的座位对数
    int sum = 0;//还需安排的士兵对数
    for (int i = 0; i < k; i++){
        sum += need[i];
    }
    if (lef >= sum){
        lef -= sum; sum = 0;
        int fi = lef + zhong * 2;
        if (fi >= dan)printf("YES\n");
        else printf("NO\n");
        return 0;
    }
    else{
        sum -= lef;
        lef = 0;
        if (zhong< sum){
        sum-=zhong;
        int now=sum*2+dan;
        if(zhong>=now)printf("YES\n");
         else printf("NO\n");
        return 0; }
        int kkk = zhong * 2 - sum;
        if (kkk >= dan)printf("YES\n");
        else printf("NO\n");
        return 0;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值