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;
}