洛谷 P1042 [NOIP2003 普及组] 乒乓球 题解 C/C++
作者:互联网
思路如下
1.模拟打乒乓球:11分制:甲得分率先到达11分,且此时与乙的得分之差大于等于2,则甲获胜,一局结束,双方比分清零;否则继续比赛,直到双方比分只差大于等于2,得分多的一方获胜;总之就是:((甲得分>=11 || 乙得分>=11)&&abs(甲得分 – 乙得分)>=2 时一局结束,输出比分即可,同时双方比分清零。21分制同理;
2.边输入边统计即可,因为要输出完11分制结果在输出21分制,所以用数组暂存21分制比分,最后输出。
//P1042 [NOIP2003 普及组] 乒乓球
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <sstream>
#define inf 0x3f3f3f3f
#define eps 1e-6
using namespace std;
#define clr(x) memset(x,0,sizeof((x)))
const int maxn = 1e4+1;//2e6+1
#define MAX(a,b,c) ((a)>(b)?((a)>(c)?(a):(c)):((b)>(c)?(b):(c)))
#define _max(a,b) ((a) > (b) ? (a) : (b))
#define _min(a,b) ((a) < (b) ? (a) : (b))
#define _for(a,b,c) for(int a = b;a<c;a++)
int readchar() {
int ch;
for(;;) {
ch = getchar();
if(ch!='\n'&&ch!='\r')return ch;
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
int ch,wn = 0,ln = 0;//wn,ln表示11分制比分
int a = 0,b = 0,i=0;//a,b表示21分制比分
int r[maxn];
clr(r);
while((ch = readchar())!=EOF&&ch!='E') {
if(ch == 'W'){ wn++;a++;}
else { ln++; b++;}
if((wn>=11||ln>=11)&&abs(wn-ln)>=2) {
printf("%d:%d\n",wn,ln);
wn = 0;
ln = 0;
}
if((a >= 21 || b>=21) && abs(a-b)>=2) {
r[i] = a;
r[i+1] = b;
i+=2;
a = 0;
b = 0;
}
}
printf("%d:%d\n\n",wn,ln);
for(int j = 0;j<i;j+=2) {
printf("%d:%d\n",r[j],r[j+1]);
}
printf("%d:%d",a,b);
return 0;
}
标签:11,ch,洛谷,NOIP2003,ln,题解,wn,include,define 来源: https://blog.csdn.net/Jason__Jie/article/details/113189834