CF-Codeforces Round #487 (Div. 2)-C-A Mist of Florescence

ACM模版

描述


题解

给定 a,b,c,d a , b , c , d 表示 A,B,C,D A , B , C , D 四种字符的联通块数,构造满足条件的情况,最多构造的尺寸不能大于 5050 50 ∗ 50

这里我们直接都构造成 5050 50 ∗ 50 的,这个题据说有无数种解法(虽然有些夸张),但是基本上都是直接构造 5050 50 ∗ 50 的大小的。

我的代码使用的构造思路是,首先将要构造的矩阵分为四块,分别用四种字符填充,这样 A,B,C,D A , B , C , D 的联通块数都为 1 1 ,然后根据 A 剩下的联通块数往 D D 区域插入,在不破坏 D 区域 D D 的联通性的前提条件下插入,一共需要插入 a 1 块互不联通的 A A ,同理,在 A 区插入 d1 d − 1 个彼此不联通且不破坏 A A 联通性的 D ,…… BC B , C 同理。

题目所给的样例还有样例解释在一定程度上是干扰的,导致一开始我在想画圈圈……

代码

#include <iostream>

using namespace std;

const int MAXN = 55;

int map[MAXN][MAXN];

int a, b, c, d;

void output()
{
    cout << 50 << ' ' << 50 << endl;
    for (int i = 0; i < 50; i++)
    {
        for (int j = 0; j < 50; j++)
        {
            putchar(map[i][j]);
        }
        putchar(10);
    }
}

int main(int argc, const char * argv[])
{
    while (cin >> a >> b >> c >> d)
    {
        a--;
        b--;
        c--;
        d--;

        for (int i = 0; i < 25; i++)
        {
            for (int j = 0; j < 25; j++)
            {
                map[i][j] = 'A';
            }
        }

// output();

        for (int i = 25; i < 50; i++)
        {
            for (int j = 0; j < 25; j++)
            {
                map[i][j] = 'B';
            }
        }

// output();

        for (int i = 0; i < 25; i++)
        {
            for (int j = 25; j < 50; j++)
            {
                map[i][j] = 'C';
            }
        }

// output();

        for (int i = 25; i < 50; i++)
        {
            for (int j = 25; j < 50; j++)
            {
                map[i][j] = 'D';
            }
        }

// output();

        for (int i = 0; i < 25; i += 2)
        {
            for (int j = 0; j < 25; j += 2)
            {
                if (d == 0)
                {
                    break;
                }

                map[i][j] = 'D';
                d--;
            }
        }

// output();

        for (int i = 25; i < 50; i += 2)
        {
            for (int j = 0; j < 25; j += 2)
            {
                if (c == 0)
                {
                    break;
                }

                map[i][j] = 'C';
                c--;
            }
        }

// output();

        for (int i = 0; i < 25; i += 2)
        {
            for (int j = 25; j < 50; j += 2)
            {
                if (b == 0)
                {
                    break;
                }

                map[i][j] = 'B';
                b--;
            }
        }

// output();

        for (int i = 25; i < 50; i += 2)
        {
            for (int j = 25; j < 50; j += 2)
            {
                if (a == 0)
                {
                    break;
                }

                map[i][j] = 'A';
                a--;
            }
        }

        output();
    }

    return 0;
}
全部评论

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务