codeforces (div2)round 487 题解(ABC)

A题
A. A Blend of Springtime

题意:有三朵花ABC和没有花的 ’ .’,每朵花凋零的时候了一向两边散布该花的颜色,凋零的顺序任意,问你能不能在有若干朵花凋零的情况下,使得某一种花有ABC三种颜色。

思路:比赛的时候读错了,然后就被x了,雪崩。其实将题目意思转化一下就很简单,就是询问你是否存在连续的ABC三个字母,字母顺序可以是任意的。

#include <bits/stdc++.h>
using namespace std;
string a;
int main() {
    cin >> a;
    int flag = 0;
    for(int i = 0; i <(int)a.size()-2 ; i++) {
        //注意这边的a.sizee(),由于这是个unsigned类型的,所以你不将他转化为int就是错的
        //因为在只有一个字母的情况下,1-2=-1,unsigned赋为负数就会有问题
        if(a[i] != a[i + 1] && a[i + 1] != a[i + 2] && a[i + 2] != a[i] && a[i] != '.' && a[i + 1] != '.' && a[i + 2] != '.') flag = 1;
        if(flag) break;
    }
    if(flag) printf("Yes\n");
    else  printf("No\n");
    return 0;
}

B题:
B. A Tide of Riverscape
题意:给出两个数n,p,和一个字符串s,其中字符串中的’.’可以变为0,也可以变为1.如果对于任意的1<=i<=|s|-p的范围内,第i个和第i+p个字符相等,那么就称p是一个周期。如果存在使p 不是字符串s的周期的字符串,那就输出这个字符串,如果不存在,就输出No。(输出的字符串只有01)
思路:只要遍历一遍整个数组判断是否存在使p不是周期的字符串,如果不存在就打印No,如果存在就记录这个位置,最后如果这个位置是’.’或者这个位置+p是’.’的话,更新使他们不相等就行了。其余的’.’随意为0或1即可。

#include <bits/stdc++.h>
using namespace std;
string a;
int p, n;
int main() {
    cin >> n >> p >> a;
    int period = (int)a.size() - p;
    int flag = 0;
    int k;
    for(int i = 1; i <= period; i++) {
        if(a[i - 1] != '.' && a[i + p - 1] != '.' && a[i - 1] == a[i + p - 1])continue;
        else {
            flag = 1;
            k = i;
            break;
        }
    }
    if(!flag) printf("No\n");
    else {
        flag = 0;
        k--;//因为记录的第k个,而字符串以0开始
        for(int i = 0; i < (int)a.size(); i++) {
            if(k == i) {
                if(a[k] != '.') {
                    if(a[k + p] == '.') {
                        if(a[k] == '1')a[k + p] = '0';
                        else a[k + p] = '1';
                    }
                } else { //a[k]='.'
                    if(a[k + p] != '.') {
                        if(a[k + p] == '1') a[k] = '0';
                        else a[k] = '1';
                    } else {
                        a[k] = '1';
                        a[k + p] = '0';
                    }
                }
                printf("%c",a[k]);
            }else {
            if(a[i]=='.') printf("1");//可以是0也可以是1
            else printf("%c",a[i]);
            }
        }
    }
    return 0;
}

C题
C. A Mist of Florescence
题意:给出4个数字分别表示字母i在某一个矩阵中联通块的数量,最后要求你输出这个你构造的矩阵的行数和列数,并输出这个矩阵。
思路:构造题。参考了官方题解上的解法。这里写图片描述
我们可以分成4个小块,先分别用ABCD分别填充。然后对于全是A块,我们在里面填充单个的C块,全是B的块里面单个填充D,CD同理。

#include <bits/stdc++.h>
using namespace std;
char mp[45][45];
int a, b, c, d;
int main() {
    cin >> a >> b >> c >> d;
    printf("40 40\n");
    a--;//因为分成了4大块,分别是ABCD,所以还需要的联通块的数量都减1
    b--;
    c--;
    d--;
    for(int i = 1; i <= 10; i++) {//每一块都是10*40的范围
        for(int j = 1; j <= 40; j++) {
            if(c && i & 1 && j & 1) {//如果C的联通块的数量还不够,并且当前位置可以填充,就将该位置置为C
                    //我的填充策略是对奇数行奇数列的格子填充。下面的块也是同理
                mp[i][j] = 'C';
                c--;
            } else  mp[i][j] = 'A';
        }
    }
    for(int i = 11; i <= 20; i++) {
        for(int j = 1; j <= 40; j++) {
            if(d && i & 1 && j & 1) {
                mp[i][j] = 'D';
                d--;
            } else  mp[i][j] = 'B';
        }
    }
    for(int i = 21; i <= 30; i++) {
        for(int j = 1; j <= 40; j++) {
            if(a && i & 1 && j & 1) {
                mp[i][j] = 'A';
                a--;
            } else  mp[i][j] = 'C';
        }
    }
    for(int i = 31; i <= 40; i++) {
        for(int j = 1; j <= 40; j++) {
            if(b && i & 1 && j & 1) {
                mp[i][j] = 'B';
                b--;
            } else  mp[i][j] = 'D';
        }
    }
    for(int i = 1; i <= 40; i++) {
        for(int j = 1; j <= 40; j++) {
            printf("%c", mp[i][j]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80664100
今日推荐