LuoguP4439 [COCI2017-2018#3] Aron 题解
虽然是个入门题,但是看题解里面好像都讲的复杂了,蒟蒻就来发一篇题解为新人造福吧。
其实你读懂题目之后这道题目就很简单了。只要把两个或以上的当做一个整体看就行了。相当于计算这里面一共有多少个整体。不过在计算答案的时候还要加上1才是自己的位置。
还没听懂?结合样例\(2\)解释一下:
输入:
6
C
C
P
C
Z
Z
这里,我们应该将第\(1\)行和第\(2\)行的两个\(\text{C}\)以及第\(5\)行和第\(6\)行的两个\(\text{Z}\)。注意,这里和去重不一样,比如上面第\(4\)行的\(\text{C}\)不能跟前面算作一个整体。这样前面就有\(4\)个人在排队,加上\(\text{Aron}\)一共有\(5\)个。所以\(\text{Aron}\)排在了第\(5\)位。
算法实现的时候可以考虑在线处理,即边输入边处理数据。当然,如果是第\(1\)个,就先得算作一个人。之后就判断当前位置的字母是否与前\(1\)位的字母相同,是的话答案就不要加任何东西,否则加\(1\)。最后输出答案加\(1\)(这个应该前面解释的很清楚了吧)。
好了,接下来给出我的\(AC\)代码供大家参考(而非抄题解):
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int n, cnt;
char a[27][2];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%s", a[i]);
if(i == 1) cnt++;
// if(i > 1)
// printf("%d:%c %d:%c\n", i, a[i][0], i - 1, a[i - 1][0]);
if(i > 1 && a[i][0] != a[i - 1][0]) cnt++;
}
printf("%d", cnt + 1);
}
//防盗水印:UID=112917
原谅我忘记写上return 0,不过以后还是建议加上的。
还有就是字符读入的问题,因为单纯地用\(char\)字符读入会出现只读入一行就数出答案的情况,所以转用大小为\(2\)的字符数组读入,然后按第一位比较就行了。
最后祝大家刷题愉快!