博客园 首页 私信博主 显示目录 隐藏目录 管理

洛谷 题解 P5595 【【XR-4】歌唱比赛】

本蒟蒻又双叒叕被爆踩了。

考试时一遍过

其实这题还是很简单的,难度不会大于普及组T1.

CSP 2019 RP++

看开始看到题目,觉得特别长,不想看。。。

我来和你们分析分析题目,你们就都可以秒了。

首先,窝们有一个串,然后对于每个字符'X'表示小X赢了,'Y'表示小Y赢了,而'Z'表示平局。只要对于每个字符进行判断就行。

比如:

XYYYXXYZ
第一个是'X',那么a[1]就要大于b[1];
第二个是'Y',那么a[2]就要小于b[2];
第三个是'Y',那么a[3]就要小于b[3];
第四个是'Y',那么a[4]就要小于b[4];
第五个是'X',那么a[5]就要大于b[5];
第六个是'X',那么a[6]就要大于b[6];
第七个是'Y',那么a[7]就要小于b[7];
第一个是'X',那么a[1]就要等于b[8];

这些都还很好理解,主要的是什么情况是无解的?

因为它每次都会加入首个元素,

所以,窝们看:

然后在找到第一个'Z'前

a[]:{1234}
b[]:{4321}

当前是'Z'的话:

窝们要是x1234和x4321相等,你找到个看看

这就是无解的状态。

接下来就是代码时间:

有注释的:

#include<bits/stdc++.h>

using namespace std;

#define maxn 1000010
#define Rep(x, a, b) for(int x = a; x <= b; ++ x)

bool flag;
char ch[maxn];
int b[maxn], a[maxn];//分别是读入的字符串,X的点赞数,Y的点赞数。

int main(){
scanf("%s", ch);//读入 
int len = strlen(ch);//找到长度 
Rep(i, 0, len - 1){
if(ch[i] == 'X'){//如果小X当前领先,那这一位a[i]要大于b[i],因为有spj,所以我用的1,2 
if(flag){//如果已经出现'Z' 
printf("-1");//无解 
return 0;
}
a[i] = 2;
b[i] = 1;
}
else if(ch[i] == 'Y'){//如果是小Y领先也是一样的。 
if(flag){//如果已经出现'Z' 
printf("-1");//无解 
return 0;
}
a[i] = 1;
b[i] = 2;
}
else{//如果当前是'z',就把flag赋值为1; 
flag = 1;
a[i] = b[i] = 1;
}
}
Rep(i, 0, len - 1) printf("%d", a[i]);//输出 
printf("\n");
Rep(i, 0, len - 1) printf("%d", b[i]);//输出 
return 0;
}

没注释的:

#include<bits/stdc++.h>

using namespace std;

#define maxn 1000010
#define Rep(x, a, b) for(int x = a; x <= b; ++ x)

bool flag;
char ch[maxn], b[maxn], a[maxn];

int main(){
scanf("%s", ch); 
int len = strlen(ch); 
Rep(i, 0, len - 1){
if(ch[i] == 'X'){ 
if(flag){ 
printf("-1"); 
return 0;
}
a[i] = 2;
b[i] = 1;
}
else if(ch[i] == 'Y'){ 
if(flag){
printf("-1");
return 0;
}
a[i] = 1;
b[i] = 2;
}
else flag = a[i] = b[i] = 1;
}
Rep(i, 0, len - 1) printf("%d", a[i]); 
printf("\n");
Rep(i, 0, len - 1) printf("%d", b[i]);
return 0;
}

PS:请看懂再抄

posted @ 2019-12-12 11:36  Flash_plus  阅读(146)  评论(0编辑  收藏  举报