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;
}
發佈了113 篇原創文章 · 獲贊 41 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章