华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1710|回复: 6
打印 上一主题 下一主题

P1042 乒乓球

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-4-19 14:15:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/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
说明
每行至多25个字母,最多有2500行
回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
推荐
 楼主| 发表于 2018-5-18 20:03:01 | 只看该作者
此题数据的读入是一个很重要的考点,一般的cin或者getline都不是很好用,应该是挨个儿字符读入直到E为止,同时将读到的字符拼成一个字符串供下面两次使用。
  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. string s;
  5. char ch;
  6. int a,b,l,i;
  7. int main()
  8. {
  9.     cin>>ch;
  10.     ///请记住这种读数据的方法 可以跳过回车等
  11.     while (ch!='E'){if (ch=='L'||ch=='W')s=s+ch;cin>>ch;}
  12.     ///cout<<s;  输出检查
  13.     l=s.size();
  14.     a=b=0;
  15.     for (i=0;i<=l-1;i++)
  16.     {
  17.         if (s[i]=='W') a++;
  18.         else if (s[i]=='L') b++;
  19.         if (abs(b-a)>=2 && (b>=11||a>=11))
  20.             {  cout<<a<<':'<<b<<endl;
  21.                  a=b=0;
  22.             }

  23.     }
  24.     cout<<a<<':'<<b<<endl;
  25.     cout<<endl;
  26.     a=b=0;
  27.     for (i=0;i<=l-1;i++)
  28.     {
  29.         if (s[i]=='W') a++;
  30.         else if (s[i]=='L') b++;
  31.         if (abs(b-a)>=2 && (b>=21||a>=21))
  32.             {  cout<<a<<':'<<b<<endl;
  33.                  a=b=0;
  34.             }

  35.     }
  36.     cout<<a<<':'<<b<<endl;
  37.     return 0;
  38. }
复制代码
回复 支持 1 反对 0

使用道具 举报

4

主题

21

帖子

89

积分

注册会员

Rank: 2

积分
89
板凳
发表于 2018-5-4 23:01:36 | 只看该作者
程序:
  1. #include<iostream>
  2. using namespace std;
  3. char a[1000005];
  4. int main()
  5. {
  6.     int w=0,l=0,j,i=1;
  7.     while(a[i]!='E')
  8.     cin>>a[i];
  9.     for(i=1;;i++)
  10.     {
  11.         if(a[i]=='E')break;
  12.         if(a[i]=='W') w++;
  13.         if(a[i]=='L') l++;
  14.         if((w>=11&&w-l>1)||(l>=11&&l-w>1))
  15. {
  16.             cout<<w<<":"<<l<<endl;
  17.             w=0;
  18.             l=0;
  19.         }
  20.     }
  21.     cout<<w<<":"<<l<<endl<<endl;
  22.     w=0;l=0;
  23.     for(i=1;;i++)
  24.     {
  25.         if(a[i]=='E')break;
  26.         if(a[i]=='W') w++;
  27.         if(a[i]=='L') l++;
  28.         if((w>=21&&w-l>1)||(l>=21&&l-w>1)){
  29.             cout<<w<<":"<<l<<endl;
  30.             w=0;
  31.             l=0;
  32.         }
  33.     }
  34.     cout<<w<<":"<<l;
  35.     return 0;
  36. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
地板
发表于 2018-7-3 17:14:52 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. char s[62510];
  4. int i=0,j=0,w=0,l=0;
  5. int main()
  6. {

  7.     do cin>>s[i];while(s[i++]!='E');
  8.     while(s[j]!='E')j++;
  9.     for(i=0;i<j;i++)
  10.     {
  11.         if(s[i]=='W')w++;
  12.         else l++;
  13.         if((w>=11 || l>=11)&&(w-l>=2 || l-w>=2))
  14.         {
  15.             cout<<w<<":"<<l<<endl;
  16.             w=0;l=0;
  17.         }
  18.     }
  19.     cout<<w<<":"<<l<<endl;
  20.     cout<<endl;w=0;l=0;
  21.      for(i=0;i<j;i++)
  22.     {
  23.         if(s[i]=='W')w++;
  24.         else l++;
  25.         if((w>=21 || l>=21)&&(w-l>=2 || l-w>=2))
  26.         {
  27.             cout<<w<<":"<<l<<endl;
  28.             w=0;l=0;
  29.         }
  30.     }
  31.      cout<<w<<":"<<l<<endl;
  32.      return 0;
  33. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
5#
发表于 2018-7-29 22:13:15 | 只看该作者
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <algorithm>
  7. using namespace std;

  8. int main(){
  9.     int i,a,b,M21=0,M11=0,L21=0,L11=0,g1=0,g2=0,print1[10000][3],print2[10000][3];
  10.     char w;
  11.     w=getchar();
  12.     while(w!='E')
  13.     {
  14.             if(w=='W')
  15.             {
  16.                     M21++;
  17.                     M11++;
  18.                 }
  19.                 else if(w=='L')
  20.                 {
  21.                         L21++;
  22.                         L11++;
  23.                 }
  24.                 if(M11>=11||L11>=11)
  25.                 {
  26.                         if(abs(M11-L11)>=2)
  27.                         {
  28.                                 g1++;
  29.                                 print1[g1][1]=M11;
  30.                                 print1[g1][2]=L11;
  31.                                 M11=L11=0;
  32.                         }
  33.                 }
  34.                 if(M21>=21||L21>=21)
  35.                 {
  36.                         if(abs(M21-L21)>=2)
  37.                         {
  38.                                 g2++;
  39.                                 print2[g2][1]=M21;
  40.                                 print2[g2][2]=L21;
  41.                                 M21=L21=0;
  42.                         }
  43.                 }
  44.                 w=getchar();
  45.         }
  46.         for(i=1;i<=g1;i++)
  47.         {
  48.                 printf("%d:%d\n",print1[i][1],print1[i][2]);
  49.         }
  50.         printf("%d:%d\n\n",M11,L11);
  51.         for(i=1;i<=g2;i++)
  52.         {
  53.                 printf("%d:%d\n",print2[i][1],print2[i][2]);
  54.         }
  55.         printf("%d:%d",M21,L21);
  56.     return 0;
  57. }
复制代码
回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
6#
发表于 2018-9-25 17:00:12 | 只看该作者
标准硬模拟题 每次循环就好了
  1. #include<iostream>
  2. using namespace std;
  3. #define FOR(iii,nn,mm) for(int iii=nn;iii<=mm;iii++)
  4. char t;
  5. bool b[70000];
  6. int c,w,l;
  7. int main()
  8. {
  9.     cin>>t;while(t!='E')
  10.     {
  11.         if(t=='W') b[c++]=1;
  12.         if(t=='L') b[c++]=0;
  13.         cin>>t;
  14.     }
  15.     FOR(i,0,c-1)
  16.     {
  17.         if(b[i]) w++;else l++;
  18.         if(w>=11&&w-l>=2) {cout<<w<<':'<<l<<endl;w=l=0;}
  19.         if(l>=11&&l-w>=2) {cout<<w<<':'<<l<<endl;w=l=0;}
  20.     }
  21.     cout<<w<<':'<<l<<endl;w=l=0;cout<<endl;
  22.     FOR(i,0,c-1)
  23.     {
  24.         if(b[i]) w++;else l++;
  25.         if(w>=21&&w-l>=2) {cout<<w<<':'<<l<<endl;w=l=0;}
  26.         if(l>=21&&l-w>=2) {cout<<w<<':'<<l<<endl;w=l=0;}
  27.     }
  28.     cout<<w<<':'<<l;
  29.     return 0;
  30. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-6 19:24 , Processed in 0.153117 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表