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 localfreopen("data.txt", "r", stdin); // freopen("data.txt", "w", stdout); #endifwork();return 0; }