题目描述
输入描述
输出描述
输入样例1
1 2 3 4
输出样例1
aqcc
abpp
abcc
输入样例2
1 2 3 3
输出样例2
NO
个人感觉是真正的签到题,合理推导以后没有任何坑点,只要暴力for语句即可解决所有问题,甚至仅需要7个字母即可(严格来说是6个),其中细分为以下几类:
a:字符串s1,s2,s3共有的字符,
b:字符串s1,s2共有的字符,
c:字符串s2,s3共有的字符,
d:字符串s1,s3共有的字符,
e:字符串s1独有的字符,
f:字符串s2独有的字符,
g:字符串s3独有的字符;
由不可构造的条件可以得出输入数据应满足 (a-min) + (b-min) + (c-min) + min ≤ n ,化简后得 a + b + c - 2 * min ≤ n,即当 a + b + c - 2 * min > n 时,直接输出NO即可,其中 min 为 a,b,c 中的最小值。
构造方法即由 a,b,c 及 min 中推出字符(a~d)分别的个数并插入对应的字符串,如果最后字符串长度不等于n,再在其末尾补上独有的字符输出即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s1[1010],s2[1010],s3[1010];
int main(){
int a,b,c,n;
cin>>a>>b>>c>>n;
int minn=min(a,b);
minn=min(minn,c);
if(a+b+c-2*minn>n){
printf("NO");
return 0;
}
for(int i=0;i<minn;i++){
s1[i]='a';
s2[i]='a';
s3[i]='a';
}
for(int i=minn;i<a;i++){
s1[i]='b';
s2[i]='b';
}
b-=minn;
c-=minn;
for(int i=a;i<a+b;i++){
s2[i]='c';
s3[i]='c';
}
for(int i=a+b;i<a+b+c;i++){
s1[i]='d';
s3[i]='d';
}
for(int i=0;i<n;i++){
if(s1[i])cout<<s1[i];
else cout<<'e';
}
cout<<endl;
for(int i=0;i<n;i++){
if(s2[i])cout<<s2[i];
else cout<<'f';
}
cout<<endl;
for(int i=0;i<n;i++){
if(s3[i])cout<<s3[i];
else cout<<'g';
}
return 0;
}