루오 구 문제 해결 --P1042 : 탁구

관련 항목

주제 링크

루오 밸리, https://www.luogu.com.cn/problem/P1042 .

내 OJ, http://47.110.135.197/problem.php?id=4746 .

제목 설명

중국 중국 각 게임의 결과를 제 공리스트를 사용하여 상기 분석을 실시하고 11 점 21 점 척도에 따라 계산되었다 (같은 기록의 끝) 두 경쟁 결과.
예를 들어, 이제 기록이 (W는 점을 얻기 위해 중국 중국 나타내고, L은 치와와 상대 이득 포인트 나타냄)
WWWWWWWWWWWWWWWWWWWWWWLW
게임의 결과 중국 중국 제 게임 11-0 승리 11 점 척도 언더 0 번째 게임 (11), 진행중인 세 번째 게임 (11)의 현재 점수 승리. 21 점 척도에서, 이번에는 게임 치와와 21 0, 첫 경기 진행의 두 번째 게임 이길했습니다 2 대 1의 점수. 게임이 막 시작 한 경우, 이번에는 점수는 0-0이었다. 차이가있을 때까지 동일하거나 게임의보다 큰 제 2 단부에만 분.
프로그램은 출력에 대한 입력 정보 (WL 형태)에 대한 일련의 게임의 정확한 결과이다.

입력 형식

각 파일은 문자열 대문자 W, L 및 E 형태의 문자열의 입력 복수의 라인을 포함한다. E는 게임 정보의 끝을 나타내는 경우, 프로그램은 E. 후 모든 것을 무시해야

출력 형식

출력은 각 부분은 복수의 행을 갖고, 두 부분으로 구성된다 (순서에 따라 게임 정보 입력) 게임의 점수에 대응하는 각 행. 제 1 부분은 11 점 만점의 결과이고, 상기 제 2 부분의 결과는 두 부분 사이에 빈 라인 (21)에 의해 분리 점을한다.

SAMPLE INPUT

WWWWWWWWWWWWWWWWWWWW
WWLWE

샘플 출력

11:0
11:0
1:1

21:0
2:1

설명

2500 개 라인 라인 당 최대 25 자.

주제 분석

문제의 의미 분석

이 시뮬레이션 질문입니다. 문자 입력은 대응하는 게임 점수를 분석한다.

샘플 데이터 분석

입력 샘플에 따르면, 우리는 테이블 아래에 전체 입력의 시뮬레이션 분석 결과를 나열했습니다.

  11 점 점수 21 점 점수
W 1 : 0 1 : 0
W 2 : 0 2 : 0
W 3 : 0 3 : 0
W 4 : 0 4 : 0
W 5 : 0 5 : 0
W 6 : 0 6 : 0
W 7 : 0 7 : 0
W 8 : 0 8 : 0
W 9 : 0 9 : 0
W 10 : 0 10 : 0
W 11 : 0 11 : 0
W 1 : 0 12 : 0
W 2 : 0 13 : 0
W 3 : 0 14 : 0
W 4 : 0 15 : 0
W 5 : 0 16 : 0
W 6 : 0 17 : 0
W 7 : 0 18 : 0
W 8 : 0 19 : 0
W 9 : 0 20 : 0
W 10 : 0 21 : 0
W 11 : 0 1 : 0
0-1 1 : 1
W 1 : 1 2 : 1
이자형    

테이블에서, 우리는 점수의 변화를 볼 수 있습니다. 때 입력 E, 우리는 필요한 출력 점수를 따릅니다.

알고리즘 세부 사항

어떻게 점수를 저장하려면?

나는 점수를 저장하기 위해 STL 큐를 사용합니다. 주요 생각 너무 게으른입니다.

각 라운드를 판단 끝?

즉 포인트 차이가 2보다 크거나, 적어도 두 지점에 특별한주의를 지불하는 작은 구덩이 여유가 있습니다. 즉하는 11 점의 경우, 적어도 11 점 이상 중 하나, 2 분의 여유. 유사 21 점 결정 방법. 나는 다음과 같은 문구를 사용합니다 :

if ((ans1[0]>=11 || ans1[1]>=11) && abs(ans1[0]-ans1[1])>=2) {
    ...
}

AC 참조 코드

#include <iostream>
#include <queue>
#include <string>
#include <iostream>
#include <sstream>
#include <cmath>

using namespace std;

int main() {
    char ch;
    int ans1[2]={};//11分制比分, ans1[0]第一个人比分, ans1[1]第二人比分
    int ans2[2]={};//21分制比分

    queue<string> q1;//11分结果
    queue<string> q2;//21分结果

    while (cin>>ch) {
        if ('E'==ch) {
            ostringstream ostr1;
            ostr1 << ans1[0] << ":" << ans1[1];
            q1.push(ostr1.str());

            ostringstream ostr2;
            ostr2 << ans2[0] << ":" << ans2[1];
            q2.push(ostr2.str());

            break;
        } else {
            if ('W'==ch) {
                //Win
                ans1[0]++;
                ans2[0]++;
            } else if ('L'==ch) {
                //Los
                ans1[1]++;
                ans2[1]++;
            }

            //统计11分制结果
            if ((ans1[0]>=11 || ans1[1]>=11) && abs(ans1[0]-ans1[1])>=2) {
                ostringstream ostr;
                ostr << ans1[0] << ":" << ans1[1];
                q1.push(ostr.str());
                ans1[0] = 0;
                ans1[1] = 0;
            }

            //统计21分制结果
            if ((ans2[0]>=21 || ans2[1]>=21) && abs(ans2[0]-ans2[1])>=2)  {
                ostringstream ostr;
                ostr << ans2[0] << ":" << ans2[1];
                q2.push(ostr.str());
                ans2[0] = 0;
                ans2[1] = 0;
            }
        }
    }

    //输出
    while (false==q1.empty()) {
        cout << q1.front() << endl;
        q1.pop();
    }
    cout << endl;
    while (false==q2.empty()) {
        cout << q2.front() << endl;
        q2.pop();
    }

    return 0;
}

시뮬레이션 타이틀, 아니 큰 어려움, 단계적으로는만큼 캔, 아마도 몇 가지 주제 코드를 좀 더 있지만 어려움이 없다는 것을 코드를 작성하는 데 필요합니다.

게시 된 235 개 원래 기사 · 원 찬양 289 · 조회수 1,070,000 +

추천

출처blog.csdn.net/justidle/article/details/104865808