1. 程式人生 > 其它 >LuoguP4439 [COCI2017-2018#3] Aron 題解

LuoguP4439 [COCI2017-2018#3] Aron 題解

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\)的字元陣列讀入,然後按第一位比較就行了。

最後祝大家刷題愉快!