Rock-Paper-Scissors Tournament
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2135 Accepted Submission(s): 672
A tournament has been organized in which each of n players plays k rock-scissors-paper games with each of the other players - k games in total. Your job is to compute the win average for each player, defined as w / (w + l) where w is the number of games won, and l is the number of games lost, by the player.
2 4 1 rock 2 paper 1 scissors 2 paper 1 rock 2 rock 2 rock 1 scissors 2 1 1 rock 2 paper 0
0.333 0.667 0.000 1.000
题目意思:
题目意思相当于两个人玩剪刀,石头,布。只是在这个题目中,换了表示方法而已。可概括为以下几个方面
paper win rock scissors win paper rock win scissors
如果两个人出的一样,不算输也不算赢,最终输出每个人获胜的概率,win/(win+lose)保留三位小数,如果win+lose的值为0,
那么0不能作除数,按题目要求输出‘-’,题目还有一个难点就是格式控制,没两组数据之间有一个空行,最后一组数据的
结果不输出换行。因此我申请了两个数组,一个数组b[],存放每组数据的人数,c[]数组存放每组数据的答案,最后将c数组中
的数输出,如果不是最后一组测试数据的答案,就输出换行,否则不换行。
题目代码:
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <stdlib.h> using namespace std; struct infor { double win;//赢的次数 double lose;//输的次数 }; int main() { int n,k,i,j,i1 = 0,i2 = 0,num1,num2,sum = 0;//n个人,k次游戏 char str1[10],str2[10]; int b[10000]; double c[100000]; while(~scanf("%d",&n)) { if(n == 0) break; scanf("%d",&k);//总共K次游戏。 b[i1++] = n;//将每组测试数据的人数保存在b数组中 infor a[10000]; for(i = 1;i <= n; i++)//将每个人的信息初始化 { a[i].win = 0;//最初每个人输赢的局数都是0 a[i].lose = 0; } for(i = 0;i < k; i++) { scanf("%d%s%d%s",&num1,str1,&num2,str2);//输入k次比赛 if(strcmp(str1,str2) == 0)//两个字符串相等,不予考虑 { continue; }
//由于出的三个东西的首字母都不同,判断输赢只用判断首字母就好 if(str1[0]=='p'&&str2[0]=='r') { a[num1].win++; a[num2].lose++; } if(str1[0]=='r'&&str2[0]=='p') { a[num1].lose++; a[num2].win++; } if(str1[0]=='s'&&str2[0]=='p') { a[num1].win++; a[num2].lose++; } if(str1[0]=='p'&&str2[0]=='s') { a[num1].lose++; a[num2].win++; } if(str1[0]=='r'&&str2[0]=='s') { a[num1].win++; a[num2].lose++; } if(str1[0]=='s'&&str2[0]=='r') { a[num1].lose++; a[num2].win++; } } for(i = 1;i <= n; i++) { if(a[i].win+a[i].lose == 0)//除数为0,则c中放置-1,在输出结果时,如果遇到-1,就输出'-' c[i2++] = -1; else c[i2++]=a[i].win/(a[i].win+a[i].lose);//否则计算赢的几率 } } int temp=0;//temp为每组答案在c数组中的起点 for(i=0;i<i1;i++) { for(j=temp;j<temp+b[i];j++)//终点为temp+b[i] {//输出答案 if(c[j]==-1) printf("-\n"); else printf("%.3lf\n",c[j]); } temp=temp+b[i];//更新temp的值 if(i != i1-1)//如果当前输出的答案不是最后一组测试数据的答案,我就输出换行 printf("\n"); } return 0; }