D. Green and Black Tea 贪心 + 构造

http://codeforces.com/contest/746/problem/D

首先说下一定是NO的情况。

假设a > b

那么,b最多能把a分成b + 1分,如果每份刚好是k的话,那么就最多能支持a的最大值是(b + 1) * k

其实就好比如,分成3分的话,x1 + x2  + x3 = m,每个xi <= k的,那么最多就是3 * k了。

所以判定下后,

后面的,如果a多,就用a,(注意不能超过k个)

b多,用b。一路模拟。

因为已经保证有解了,所以模拟后就是答案。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;


#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
void pr(int k, char ch) {
    for (int i = 1; i <= k; ++i) {
        printf("%c", ch);
    }
}
void work() {
    int n, k, a, b;
    scanf("%d%d%d%d", &n, &k, &a, &b);
    if ((LL)k * (min(a, b) + 1) < max(a, b)) {
        cout << "NO" << endl;
        return;
    }
    int to = 0;
    int has = 0;
    if (a > b) {
        while (to < n) {
            if (a > b && has < k) {
                printf("G");
                has++;
                a--;
                to++;
            } else {
                printf("B");
                b--;
                has = 0;
                to++;
            }
        }
    } else {
        while (to < n) {
            if (b > a && has < k) {
                printf("B");
                has++;
                to++;
                b--;
            } else {
                printf("G");
                has = 0;
                to++;
                a--;
            }
        }
    }
}

int main() {
#ifdef local
    freopen("data.txt", "r", stdin);
//    freopen("data.txt", "w", stdout);
#endif
    work();
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/liuweimingcprogram/p/6195960.html