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。一路模拟。
因为已经保证有解了,所以模拟后就是答案。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }