題意很簡單了,給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;
}