LCS(2021牛客多校第四场C)

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值