[洛谷]P1042乒乓球 練手模擬

【臥薪嘗膽】
題目背景

國際乒聯現在主席沙拉拉自從上任以來就立志于推行一系列改革,以推動乒乓球運動在全球的普及。其中11分制改革引起了很大的爭議,有一部分球員因為無法適應新規則只能選擇退役。華華就是其中一位,他退役之后走上了乒乓球研究工作,意圖弄明白11分制和21分制對選手的不同影響。在開展他的研究之前,他首先需要對他多年比賽的統計數據進行一些分析,所以需要你的幫忙。

題目描述

華華通過以下方式進行分析,首先將比賽每個球的勝負列成一張表,然后分別計算在11分制和21分制下,雙方的比賽結果(截至記錄末尾)。

比如現在有這么一份記錄,(其中W表示華華獲得一分,L表示華華對手獲得一分):

WWWWWWWWWWWWWWWWWWWWWWLW

在11分制下,此時比賽的結果是華華第一局11比0獲勝,第二局11比0獲勝,正在進行第三局,當前比分1比1。而在21分制下,此時比賽結果是華華第一局21比0獲勝,正在進行第二局,比分2比1。如果一局比賽剛開始,則此時比分為0比0。直到分差大于或者等于2,才一局結束。

你的程序就是要對于一系列比賽信息的輸入(WL形式),輸出正確的結果。

輸入輸出格式

輸入格式:
每個輸入文件包含若干行字符串(每行至多20個字母),字符串有大寫的W、L和E組成。其中E表示比賽信息結束,程序應該忽略E之后的所有內容。

輸出格式:
輸出由兩部分組成,每部分有若干行,每一行對應一局比賽的比分(按比賽信息輸入順序)。其中第一部分是11分制下的結果,第二部分是21分制下的結果,兩部分之間由一個空行分隔。

輸入輸出樣例

輸入樣例#1:
WWWWWWWWWWWWWWWWWWWW
WWLWE
輸出樣例#1:
11:0
11:0
1:1

21:0
2:1
【分析】
在做題之前我們一定要先讀懂題,千萬不要學我,看到一半跟著自己感覺走,寫了很久,只有90分,到最后才發現是理解出錯了,所以讀懂題很重要!!
【思路】
從題中我們得知它需要我們球11分制和21分制的比分結果,也就是華華對手或華華誰更快到達(11或21)分時,并且比分差的絕對值不小于2,就輸出比分(立為一局),當然這里還有一個重要的點,就是最后一局比賽時,可能比分不會到11或21,我們直接搜索到E結尾,最后退出循環再輸出一遍最后局結果即可。
【實現】
我們可以直接用2個for循環進行上面的操作,實現計數:

#include <iostream>
#include <cstdio>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
char s[100000];
int main()
{
    char a;
    int i = 0; string str; bool brk = false;
//讀取數據
    while (true)
    {
        getline(cin, str);
        for (int j = 0; j < str.length(); j++)
        {
            a = str[j];
            if (a == 'E') {
                brk = true; break;
            }
            s[i] = a;
            i++;
        }
        if (brk) break;
    }
    int w = 0, l = 0;
    //11分制
    for (int b = 0; b < i; b++)
    {
        //計分
        if (s[b] == 'W')w++;
        if (s[b] == 'L')l++;
        //W或L比賽者到達11時,并且比分差不小于2,立為一局,輸出一局比分
        if ((w >= 11 || l >= 11) && abs(w - l) >= 2)
        {
            cout << w << ":" << l << endl;
            w = 0, l = 0;
            continue;
        }
    }
    cout << w << ":" << l << endl;//輸出最后局比分 w<=11 || l<=11
    cout << endl;
    w = 0, l = 0;
    //21分制
    for (int b = 0; b < i; b++)
    {
        //計分
        if (s[b] == 'W')w++;
        if (s[b] == 'L')l++;
        //W或L比賽者到達21時,并且比分差不小于2,立為一局,輸出一局比分
        if ((w >= 21 || l >= 21) && abs(w - l) >= 2)
        {
            cout << w << ":" << l << endl;
            w = 0, l = 0;
            continue;
        }
    }
    cout << w << ":" << l << endl;//輸出最后局比分 w<=21 || l<=21
    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,754評論 18 399
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,123評論 6 13
  • 目標:想要做產品經理 產品經理技能體系
    小二姑閱讀 213評論 0 0
  • 你好啊!未來的女朋友: 看到這封信的時候,請不要感到驚訝,我是你未來的男朋友。 在我的二十多年生命中,曾出現過貌似...
    li柏謙閱讀 824評論 8 12
  • 自從寶林吳氏懷有身孕兩月之事在中宮爆出,一時內宮和朝堂嘩然。 寶林吳氏本是掖庭的灑掃宮女,被陛下偶然看中,然后從更...
    君清兮閱讀 334評論 0 0