Codeforces Round #386 (Div. 2) D

来源:互联网 发布:软件测试招聘 石家庄 编辑:程序博客网 时间:2024/06/01 23:33

先插多的,再插少的;

关键在于先整体赋值这种思路

代码如下

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int main(){int n,k,a,b,p;char aa='G',bb='B';scanf("%d %d %d %d",&n,&k,&a,&b);if(b>a) {swap(a,b); swap(aa,bb);  //保证a为多的; }char s[100005];memset(s,0,sizeof(s));for(int i=0;i<n;i++)s[i]=aa;for(int i=k;i<n;i+=(k+1)){s[i]=bb;b--;if(b==0) { p=i; break; }}if(b==0&&(n-1-p<=k))printf("%s\n",s);else if(b==0&&(n-1-p>k))printf("NO\n");else {for(int i=0;i<n;i++){if((i==0&&s[1]==aa&&s[i]==aa)||(i==n-2&&s[n-1]==aa&&s[i]==aa)||(s[i-1]==aa&&s[i+1]==aa&&s[i]==aa)){s[i]=bb;b--;}if(b==0) break;}if(b==0) printf("%s\n",s);else printf("NO\n");}}

别人写的,更简单

#include<bits/stdc++.h>using namespace std;int main(){    int N,K,a,b;    char B = 'B',G = 'G';    scanf("%d %d %d %d",&N,&K,&a,&b);    if(a > b) swap(a,b),swap(B,G);    string st(N,B);    for(int i = K ; i < N ; i += K + 1){        if(a == 0){            printf("NO\n");            return 0;        }        st[i] = G;        a--;    }    for(int i = 0 ; i < N && a > 0 ; i++){        if(st[i] == G || (i > 0 && st[i - 1] == G) || (i + 1 < N && st[i + 1] == G)) continue;        st[i] = G;        a--;    }    cout << st;    return 0;}


原创粉丝点击