Codeforces Round 428 B Game of the rows 贪心 思维

  题目链接: http://codeforces.com/contest/839/problem/B

  题目描述: 有K种人, 有N排的11, 1111, 11的座位, 要求不同种人不能坐在相邻的位置, 给你K种人每种人的人数, 问能不能安排的下?

  解题思路: 首先我们先放不小于三个的,挨个遍历, 只能放4 或者 2 * 2, 先放4, 再放 2 * 2 如果这时候不够放了, 直接输出NO

    然后就剩下一个的还有两个的, 我们先放两个的, 两个当然放在2是最优的, 然后再放4, 这时注意放4之后1的数量加加, 这样的话如果四个或者两个都没有的话可以拆成两个1

    最后就只有一堆一个了, 我们先看1还有没有, 有就放1 ,没有放2, 再则放4, 同时1加加, 这样最后判一遍放没放完就行了

  代码: 

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,0x3f,sizeof(a))
using namespace std;
int a[107];

int main() {
    int n, k;
    cin >> n >> k;
    for( int i = 1; i <= k; i++ ) {
        cin >> a[i];
    }
    int s4 = n;
    int s2 = n << 1;
    int s1 =0;
    for( int i = 1; i <= k; i++ ) {
        while( s4 > 0 && a[i] >= 3 ) {
            s4--;
            a[i] -= 4;
        }
        if( s4 == 0 ) break;
    }
    for( int i = 1; i <= k; i++ ) {
        while( s2 > 0 && a[i] >= 3 ) {
            s2 -= 2;
            a[i] -= 4;
        }
    }
    if( s2 < 0 ) {
        cout << "NO" << endl;
        return 0;
    }
//    for( int i = 1; i <= k; i++ ) {
//        cout << a[i] << " ";
//    }
//    cout << endl;
    for( int i = 1; i <= k; i++ ) {
        if( a[i] == 2 ) {
            if( s2 > 0 ) {
                s2--;
                a[i] -= 2;
            }
            else if( s4 > 0 ) {
                s4--;
                a[i] -= 2;
                s1++;
            }
            else if( s1 >= 1 ) {
                s1 -= 2;
                a[i] -= 2;
            }
        }
    }
    if( s1 < 0 ) {
        cout << "NO" << endl;
        return 0;
    }
    for( int i = 1; i <= k; i++ ) {
        if( a[i] >= 2 ) {
            cout << "NO" << endl;
            return 0;
        }
    }
    for( int i = 1; i <= k; i++ ) {
        if( a[i] == 1 ) {
            if( s2 > 0 ) {
                s2--;
                a[i] = 0;
            }
            else if( s4 > 0 ) {
                s4--;
                s1++;
                a[i] = 0;
            }
            else if( s1 > 0 ) {
                s1--;
                a[i] = 0;
            }
        }
    }
    for( int i = 1; i <= k; i++ ) {
        if( a[i] > 0 ) {
            cout << "NO" << endl;
            return 0;
        }
    }
    cout << "YES" << endl;
    return 0;
}
View Code

  思考: 代码写的巨丑, 昨天做的CF, 卡在B题一直出不来, 自己刚开始贪心4是对的, 但是后来应该有好多情况没有, 我多考虑造成结果错了, 还是没想清楚

 

posted on 2017-08-14 11:02  FriskyPuppy  阅读(181)  评论(0编辑  收藏  举报

导航