CodeForces 839B Game of the Rows

传送门: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

 

posted on 2017-08-19 10:56  仰望咸鱼Orzzzz  阅读(212)  评论(0编辑  收藏  举报

导航