1. 程式人生 > >CodeForces 839B Game of the Rows

CodeForces 839B Game of the Rows

n) namespace ref sin problems display src ica all

傳送門:http://codeforces.com/problemset/problem/839/B

題意:

   一個飛機的每一排的座位排列如下圖,圖中相鄰的座位為{1,2},{3,4},{4,5},{5,6},{7,8},飛機共有n排,現在有k隊人需要安排座位,問能否有一種安排,使任何兩個不同隊伍的人不相鄰。

技術分享

題解:

  這道題真的是從頭wa到尾,完全跑暴力還tle了,好菜啊。。。。

  將座位分為兩種一種四連坐,一種二連坐。

  將每個隊伍先盡可能的按4個人直接安排。可能會多出1,2,3個人統計多出1/2/3個人的數量:c[1],c[2],c[3].

  先處理3個人的情況先盡可能排在4連坐。如果剩余,剩下的將3人拆分成2人和1人,2人直接排在二連坐,剩下的一人加入到c[1]中。

  再處理2人情況,考慮單獨1個人的話座位浪費太多,於是盡量先將2人和1人合起來排在4連坐,即3位置為1人56位置兩人。這道題最大的坑點是考慮如何使有2人隊時盡量坐滿,我們可以這樣處理,先考慮四連坐,取出兩個四連坐,兩個3位置分別坐一個2人隊的2個人。兩個56分別坐兩個2人隊伍這樣兩排8個人的位置就可以坐6個人(開始沒想到,一直wa到test43)。如果有剩余的話只能單獨排位了,因為2連坐沒有浪費,所以先排2連坐在排4連坐。

  剩下的只有一個人了,二連坐一排只能坐一個,四連坐一排只能坐2個。

技術分享
 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3
using namespace std; 4 typedef long long ll; 5 const int mod=1e9+7; 6 const int maxn=1e4+100; 7 const double eps=1e-10; 8 int n,k,a[105],use,need,all,c[5],mi; 9 int main() { 10 #ifdef ac 11 freopen("in.txt" , "r" , stdin); 12 // freopen("out.txt" , "w" , stdout); 13 #endif 14 cin >> n >> k; all=n;use=n*2
; 15 for(int i=1;i<=k;++i) cin >> a[i]; 16 for(int i=1;i<=k;++i) { 17 while(all&&a[i]>=4)all--,a[i]-=4; 18 } 19 for(int i=1;i<=k;++i) { 20 use-=a[i]/4*2;a[i]%=4; 21 c[a[i]]++; 22 } 23 if(c[3]) { 24 mi=min(c[3],all); all-=mi; c[3]-=mi; 25 mi=min(use,c[3]); use-=mi; c[3]-=mi; c[1]+=mi; 26 if(c[3]) { 27 cout << "NO" << endl; 28 return 0; 29 } 30 } 31 if(c[2]) { 32 mi=min(min(all,c[2]) ,c[1]); all-=mi; c[2]-=mi;c[1]-=mi; 33 mi=min(use,c[2]); c[2]-=mi; use-=mi; 34 mi=min(all/2,c[2]/3); all-=mi*2; c[2]-=mi*3; 35 36 while(c[2]&&all) { 37 all--; c[2]--; 38 if(c[1])c[1]--; 39 } 40 if(c[2]) { 41 cout << "NO" << endl; 42 return 0; 43 } 44 } 45 if(c[1]) { 46 all=all*2+use; 47 if(all<c[1]) { 48 cout << "NO" << endl; 49 return 0; 50 } 51 } 52 cout << "YES" << endl; 53 return 0; 54 }
View Code

CodeForces 839B Game of the Rows