惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
A
About on SuperTechFans
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 叶小钗
博客园 - 聂微东
博客园 - Franky
Apple Machine Learning Research
Apple Machine Learning Research
罗磊的独立博客
量子位
博客园 - 三生石上(FineUI控件)
Recent Announcements
Recent Announcements
The GitHub Blog
The GitHub Blog
B
Blog RSS Feed
T
The Blog of Author Tim Ferriss
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

Ariasakaの小窝

Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝
Ariasakaの小窝
2023-02-03 · via Ariasakaの小窝

前往以下网站,不保证安全性哦喵~P1042 [NOIP2003 普及组] 乒乓球洛谷

前言

本题解原为在FZQOJ上老师的任务,还是我第一次在QOJ上写题解

题面

点击查看题面

## 题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 $11$ 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 $11$ 分制和 $21$ 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。 ## 题目描述 华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 $11$ 分制和 $21$ 分制下,双方的比赛结果(截至记录末尾)。 比如现在有这么一份记录,(其中 $\texttt W$ 表示华华获得一分,$\texttt L$ 表示华华对手获得一分): $\texttt{WWWWWWWWWWWWWWWWWWWWWWLW}$ 在 $11$ 分制下,此时比赛的结果是华华第一局 $11$ 比 $0$ 获胜,第二局 $11$ 比 $0$ 获胜,正在进行第三局,当前比分 $1$ 比 $1$。而在 $21$ 分制下,此时比赛结果是华华第一局 $21$ 比 $0$ 获胜,正在进行第二局,比分 $2$ 比 $1$。如果一局比赛刚开始,则此时比分为 $0$ 比 $0$。直到分差大于或者等于 $2$,才一局结束。 你的程序就是要对于一系列比赛信息的输入($\texttt{WL}$ 形式),输出正确的结果。 ## 输入格式 每个输入文件包含若干行字符串,字符串有大写的 $\texttt W$ 、 $\texttt L$ 和 $\texttt E$ 组成。其中 $\texttt E$ 表示比赛信息结束,程序应该忽略 $\texttt E$ 之后的所有内容。 ## 输出格式 输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是 $11$ 分制下的结果,第二部分是 $21$ 分制下的结果,两部分之间由一个空行分隔。 ## 样例 #1 ### 样例输入 #1 WWWWWWWWWWWWWWWWWWWW WWLWE ### 样例输出 #1 11:0 11:0 1:1 21:0 2:1 ## 提示 每行至多 $25$ 个字母,最多有 $2500$ 行。 (注:事实上有一个测试点有 $2501$ 行数据。) 【题目来源】 NOIP 2003 普及组第一题

解析

关于十一分制和二十一分制

在原题中,对于这种分制,描述是这样的:

在 $11$ 分制下,此时比赛的结果是华华第一句 $11:0$ 获胜,第二局 $11:0$ 获胜,正在进行第三局,当前比分 $1:1$ 。而在 $21$ 分制下,此时比赛结果是华华第一局 $21:0$ 获胜,正在进行第二局,比分$2:1$。如果一局比赛刚开始,则此时比分为 $0:0$ 。直到分差大于或者等于 $2$ ,才一局结束。

很显然地,我们可以看出一个条件:如果分差 $\ge 2$ ,比赛就结束了。(应该是为了考虑拉开差距)

但是这个样例看起来人畜无害非常简单,其实就是阻碍理解的一种ex数据:因为这里的悬殊太大,甚至华华对手基本上没有拿到分!

在第一次遇到的时候我的理解则是总分大于 $11$ 或 $21$就结束 而且没有考虑分差的情况 且分数差距大于2时比赛结束 (因为 $11+0=11$ ?) ,然后写的程序虽然能过样例,但是喜提爆零 WA声一片

pSsPIOJ.png

遂尝试求助网络,有幸搜到了一个较清楚的百科:

11分制,乒乓球运动比赛规则之一。国际乒联2001年9月1日修订。一场比赛由奇数局组成,在一局比赛中,先得11分的一方为胜方。10平后,先夺得2分的一方为胜方。发、接球次序在获得每2分之后,接发球方即成为发球方。10平后,每方只轮发一球。在决胜局中,一方先得5分时,双方应交换位置。

从这个规矩就可以很明显看出来:只需要满足(a>=11||b>=11)&&abs(a-b)>=2这个条件即可。

简单的模拟思路

这道题当然是一个较为简单但是坑爹的模拟题,按照题意计分即可。

我们使用双层while循环,第一层循环每一局,第二层则是每一局的计分。第二层计分循环除了以上的退出条件之外,还需要考虑最后一个局可能出现不完整的现象,这种情况下只需要检测到全部计分完成之后退出即可(用一个变量记字数)。

输入分好几行,其实可以视为一行,我使用的是getchar来读入直到检测到E字符。

代码

话不多说上代码:

我已经认真读完并理解了上面的解析,并且不会直接照搬
CPP
#include<bits/stdc++.h>
using namespace std;
char f[1919810],t;
int main(){
    int n=1,k=1;
    while(true){ //读取部分,用getchar手搓一个
        t=getchar();
        if(t=='E') break;
        if(t!='\n'&&t!=' '){ //忽略回车和空格
            f[n]=t;
            n++; //n拿来记字数,后面会考
        }
    }
    f[n]='\0';
    n--;
    int flag=0;
    while(true){ //11分制,外层循环
        int a=0,b=0;//计分
        while(true){ //每一局的计分
            if(k>n){ //k记录已经读取的字符个数,这里说明最后一个残局已经完了了,退出循环
                flag=1;
                break; 
            }
            if(abs(a-b)>=2&&(a>=11||b>=11)){ //bt退出条件,进入下一局
                break;
            }
            if(f[k]=='W'){ //想必W就是Win的意思罢(无慈悲)
                a++;
            }
            else if(f[k]=='L'){ //想必L就是Lost的意思罢(无慈悲)
                b++;
            }
            k++;
        }
        if(flag){
            printf("%d:%d\n",a,b); //书接上回
            break;
        }
        printf("%d:%d\n",a,b); //输出
    }
    printf("\n");
    k=1; //记得重置变量!!!
    flag=0;
    while(true){ //二十一分制,同上
        int a=0,b=0;
        while(true){
            if(k>n){
                flag=1;
                break; 
            }
            if(abs(a-b)>=2&&(a>=21||b>=21)){
                break;
            }
            if(f[k]=='W'){
                a++;
            }
            else if(f[k]=='L'){
                b++;
            }
            k++;
        }
        if(flag){
            printf("%d:%d\n",a,b);
            break;
        }
        printf("%d:%d\n",a,b);
    } 
    //全剧终
    return 0;
}

洛谷P1042 [NOIP2003 普及组] 乒乓球