LuoguP4439 [COCI2017-2018#3] Aron 題解
阿新 • • 發佈:2021-12-23
LuoguP4439 [COCI2017-2018#3] Aron 題解
一共有\(5\)個。所以\(\text{Aron}\)排在了第\(5\)位。
雖然是個入門題,但是看題解裡面好像都講的複雜了,蒟蒻就來發一篇題解為新人造福吧。
其實你讀懂題目之後這道題目就很簡單了。只要把兩個或以上的當做一個整體看就行了。相當於計算這裡面一共有多少個整體。不過在計算答案的時候還要加上1才是自己的位置。
還沒聽懂?結合樣例\(2\)解釋一下:
輸入:
6
C
C
P
C
Z
Z
這裡,我們應該將第\(1\)行和第\(2\)行的兩個\(\text{C}\)以及第\(5\)行和第\(6\)行的兩個\(\text{Z}\)。注意,這裡和去重不一樣,比如上面第\(4\)行的\(\text{C}\)不能跟前面算作一個整體。這樣前面就有\(4\)個人在排隊,加上\(\text{Aron}\)
演算法實現的時候可以考慮線上處理,即邊輸入邊處理資料。當然,如果是第\(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\)的字元陣列讀入,然後按第一位比較就行了。
最後祝大家刷題愉快!