洛谷 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;
}
上一篇:verilog的一些总结


下一篇:洛谷P1044 [NOIP2003 普及组] 栈(DP、卡特兰数、递推)