【題目背景】國際乒聯現在主席沙拉拉自從上任以來就立志于推行一系列改革,以推動乒乓球運動在全球的普及。其中 11 分制改革引起了很大的爭議,有一部分球員因為無法適應新規則只能選擇退役。華華就是其中一位,他退役之后走上了乒乓球研究工作,意圖弄明白 11 分制和 21 分制對選手的不同影響。在開展他的研究之前,他首先需要對他多年比賽的統計數據進行一些分析,所以需要你的幫忙。
【題目描述】 華華通過以下方式進行分析,首先將比賽每個球的勝負列成一張表,然后分別計算在 11 分制和 21 分制下,雙方的比賽結果(截至記錄末尾)。 比如現在有這么一份記錄,(其中 W 表示華華獲得一分,L 表示華華對手獲得一分): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?WWWWWWWWWWWWWWWWWWWWWWLW
在 11 分制下,此時比賽的結果是華華第一局 11 比 0 獲勝,第二局 11 比 0 獲勝,正在進行第三局,當前比分 1 比 1。而在 21 分制下,此時比賽結果是華華第一局 21 比 0 獲勝,正在進行第二局,比分 2 比 1。如果一局比賽剛開始,則此時比分為 0 比 0。直到分差大于或者等于 2,才一局結束。 注意:當一局比賽結束后,下一局立刻開始。 你的程序就是要對于一系列比賽信息的輸入(WL 形式),輸出正確的結果。
【輸入格式】 每個輸入文件包含若干行字符串,字符串由大寫的 W 、 L 和 E 組成。其中 E 表示比賽信息結束,程序應該忽略 E 之后的所有內容。
【輸出格式】 輸出由兩部分組成,每部分有若干行,每一行對應一局比賽的比分(按比賽信息輸入順序)。其中第一部分是 11 分制下的結果,第二部分是 21 分制下的結果,兩部分之間由一個空行分隔。
問題重述
我們需要根據給定的比賽記錄(由'W'、'L'和'E'組成,其中'E'表示結束),分別計算在11分制和21分制下的比賽結果。比賽規則如下:
- 每局比賽先達到11分(或21分)且領先對手至少2分的選手贏得該局。
- 如果比分達到10-10(或20-20),則需要繼續比賽,直到一方領先2分為止。
- 一局比賽結束后,下一局立即開始,比分從0-0重新開始。
- 輸出時,第一部分是11分制下的所有局比分,第二部分是21分制下的所有局比分,兩部分之間用空行分隔。
解題思路:
只需要對讀入的內容進行統計即可。使用數組a來記錄下從最開始到結束的得分情況。如果是華華贏就記錄1,反正記為0。讀到E的時候直接就不再繼續讀入,而讀到換行符也直接忽略。同時要記錄他們一共打了幾球(就是n)
然后分別對兩種賽制進行計算。首先計分板上雙方都是0。如果華華贏了,w就增加1,否則l增加1.如果發現計分板上得分高的一方達到了賽制要求的球數,而且分差也足夠,就將計分板的得分輸出,同時計分板清零開始下一局。到最后還要輸出正在進行中的比賽的得分。
代碼:
#include <iostream>
#include <cmath>
using namespace std;
int f[2]={11,21};//兩種賽事的獲獎得分
int a[25*2500+10] ; //a記錄從開始到結束華華的得分情況?
int n=0; //n記錄他們一共打了幾球?
int main(){char tmp;while(1){cin>>tmp;//不斷讀入結果if(tmp=='E') break;else if(tmp=='W') a[n++]=1; //華華贏?else if(tmp=='L') a[n++]=0; //華華輸?}for(int k=0;k<2;k++) { //兩種賽制循環int w=0,l=0;for(int i=0;i<n;i++) {w+=a[i];l+=1-a[i];if(max(w,l)>=f[k] && abs(w-l)>=2){cout<<w<<":"<<l<<endl;w=l=0;}}cout<<w<<":"<<l<<endl;//未完成的比賽也要輸出結果cout<<endl;?}return 0;
}
本題思路很簡單,直接根據題意和生活常識模擬運算。但是還有一些需要注意的地方:
- 數組要開夠,至少需要容納25*2500條得分記錄。
- 讀到E就停止讀入了,后面的都忽略掉。同時遇到換行符等也要忽略。
- 注意要分差2分以上才算一局的結果。
- 最后還要輸出正在進行中的比賽,就算是剛剛完成一局也要輸出0:0。
題目幾乎每一句話都很關鍵,所以一定要認真審題。不過,有些題目可能因存在不嚴謹的地方而引起歧義,所以比賽中如果發現字面意思不清楚,可以找比賽組織者(監考老師、志愿者、答疑帖等)明確題意。