洛谷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时总是想不到这些神奇的情况。
Helps yourself for your long way ahead.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具