洛谷P1042 乒乓球

洛谷P1042 乒乓球

题目来源:https://www.luogu.com.cn/problem/P1042
简单描述:输入数行字符串,W代表我方得分,L代表对方得分,最后根据11分制与21分制的规则分别输出两种规则下的最终比分。
————
输入案例:
WWWWWWWWWWWWWWWWWWWW
WWLWE
————
输出案例:
11:0
11:0
1:1

21:0
2:1
————
代码如下:

#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <sstream>
using namespace std;
int main(){
    int a[2]={0},b[2]={0},c[6000],d[6000],p[3000],q[3000];
    int count1=0,count2=0;
  string s1;
  while(getline(cin,s1)){
    stringstream ss(s1);
    char ch;
    while(ss>>ch){
        if(ch=='E') break;
        switch(ch){
            case 'W':{
                a[0]++;
                a[1]++;
                if(a[0]>=11){
                    if(a[0]-b[0]>=2){
                        c[count1]=a[0];
                        d[count1++]=b[0];
                        a[0]=0;
                        b[0]=0;
                    }
                }
                if(a[1]>=21){
                    if(a[1]-b[1]>=2){
                        p[count2]=a[1];
                        q[count2++]=b[1];
                        a[1]=0;
                        b[1]=0;
                    }
                }
                break;
            }
            case 'L':{
                b[0]++;
                b[1]++;
                if(b[0]>=11){
                    if(b[0]-a[0]>=2){
                        c[count1]=a[0];
                        d[count1++]=b[0];
                        a[0]=0;
                        b[0]=0;
                    }
                }
                if(b[1]>=21){
                    if(b[1]-a[1]>=2){
                        p[count2]=a[1];
                        q[count2++]=b[1];
                        a[1]=0;
                        b[1]=0;
                    }
                }
                break;
            }
        }
    }
    
  }
  
        
            c[count1]=a[0];
            d[count1++]=b[0];
        
        
            p[count2]=a[1];
            q[count2++]=b[1];
        
        for(int i=0;i<count1;i++){
            printf("%d:%d\n",c[i],d[i]);
        }
        for(int i=0;i<count2;i++){
            printf("\n%d:%d",p[i],q[i]);
        }
        return 0;
}

这道题在学校的oj中做到过,是个十分简单的模拟,但题目描述有些迷惑,读取E后是否直接输出结果,还是换行后继续读取知道终止符没有说清楚,经测试是后者。可是发现案例仍有两个WA,我理了理模拟逻辑发现没问题,一时半会儿也想不到bug在哪,就下载了测试案例,发现是.in与.out文件。由于不清楚其用法,就上网搜索了一下,发现在用C++读取时和一般文本文件没啥区别,就直接修改后缀为txt查看测试案例,发现当第一个字符就为E且不再输入时,程序仍需输出0:0,考虑到还有一组数据WA且不太可能和这个情况完全一样,我合理推测是读取结束后哪怕最后一轮是0:0(也就是上一轮刚好结束,下一轮实际上未开始)也要将其输出,修改后再次提交,成功AC。
最后感叹一下我贫瘠的想象力,debug时总是想不到这些神奇的情况。

posted @   Festu  阅读(112)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示