Codeforces Round #487 C:(989C) A Mist of Florescence

题目链接
提议就是让你构造一个n*m的图,使得’A’,’B’,’C’,’D’的联通块个数分别为a,b,c,d
n,m<=50,1<=a,b,c,d<=100
想法
我们可以想一下,m可以直接取到最大,因为多余的块可以有同一种字符填补,不会影响结果
然后我们可以想一下,
我们可以用B来帮助A构造,用1个B的联通块就可以帮助A构造
BBBBBBBBBBBBBBBBBBBBBBBBBBBB
ABABABABABABABABABABABABABAB
BBBBBBBBBBBBBBBBBBBBBBBBBBBB
我们可以类似上图完成A的构造,之后用C帮助B,D帮助C
而D帮助C的时候,我们要注意,这个时候要让C留出一块来帮助D
DDDDDDDDDDDDDDDDDDDDDDDDDD
CDCDCDCDCDCDCDCDCDCDCDCDCD
CDDDDDDDDDDDDDDDDDDDDDDDDD
CCCCCCCCCCCCCCCCCCCCCCCCCC
DCDCDCDCDCDCDCDCDCDCDCDCDC
CCCCCCCCCCCCCCCCCCCCCCCCCC
这样就能保证C联通块个数不变的情况下帮助D构造成功。
代码

#include<iostream>
using namespace std;
char pic[55][55];
int main()
{
    ios::sync_with_stdio(false);
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int pos=0;//记录当前行
    while(a)
    {
        if(a>=25)
        {
            for(int i=0;i<50;i+=2) pic[pos][i]='A';
            for(int i=1;i<50;i+=2) pic[pos][i]='B';
            a-=25;
            pos++;
             for(int i=0;i<50;i++) pic[pos][i]='B';
            pos++;
        }
        else
        {
            for(int i=0;i<50;i++)   pic[pos][i]='B';
            for(int i=0;i<a*2;i+=2) pic[pos][i]='A';
            pos++;
            for(int i=0;i<50;i++) pic[pos][i]='B';
            pos++;
            break;
        }
    }
    for(int i=0;i<50;i++) pic[pos][i]='C';
    pos++;
    b--;
    while(b)
    {
        if(b>25)
        {
            for(int i=0;i<50;i+=2) pic[pos][i]='B';
            for(int i=1;i<50;i+=2) pic[pos][i]='C';
            b-=25;
            pos++;
            for(int i=0;i<50;i++) pic[pos][i]='C';
            pos++;
        }
        else
        {
            for(int i=0;i<50;i++)   pic[pos][i]='C';
            for(int i=0;i<b*2;i+=2) pic[pos][i]='B';
            pos++;
            for(int i=0;i<50;i++) pic[pos][i]='C';
            pos++;
            break;
        }
    }
    c--;
    for(int i=0;i<50;i++) pic[pos][i]='D';
    if(c==0) pic[pos][0]='C';
    pos++;
    while(c)
    {
        if(c>25)
        {
            for(int i=0;i<50;i+=2) pic[pos][i]='C';
            for(int i=1;i<50;i+=2) pic[pos][i]='D';
            c-=25;
            pos++;
            for(int i=0;i<50;i++) pic[pos][i]='D';
            pos++;
        }
        else
        {
            for(int i=0;i<50;i++)   pic[pos][i]='D';
            for(int i=0;i<c*2;i+=2) pic[pos][i]='C';
            pos++;
            pic[pos][0]='C';
            for(int i=1;i<50;i++) pic[pos][i]='D';
            pos++;
            break;
        }
    }
    for(int i=0;i<50;i++) pic[pos][i]='C';
    pos++;
    d--;
    while(d)
    {
        if(d>25)
        {
            for(int i=0;i<50;i+=2) pic[pos][i]='D';
            for(int i=1;i<50;i+=2) pic[pos][i]='C';
            d-=25;
            pos++;
            for(int i=0;i<50;i++) pic[pos][i]='C';
            pos++;
        }
        else
        {
            for(int i=0;i<50;i++)   pic[pos][i]='C';
            for(int i=0;i<d*2;i+=2) pic[pos][i]='D';
            pos++;
            for(int i=0;i<50;i++) pic[pos][i]='C';
            pos++;
            break;
        }
    }
    cout<<pos<<" "<<50<<endl;
    for(int i=0;i<pos;i++)
    {
        for(int j=0;j<50;j++)
            cout<<pic[i][j];
        cout<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值