HDU:1148 Rock-Paper-Scissors Tournament

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


Problem Description
Rock-Paper-Scissors is game for two players, A and B, who each choose, independently of the other, one of rock, paper, or scissors. A player chosing paper wins over a player chosing rock; a player chosing scissors wins over a player chosing paper; a player chosing rock wins over a player chosing scissors. A player chosing the same thing as the other player neither wins nor loses. 
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. 
 

Input
Input consists of several test cases. The first line of input for each case contains 1 ≤ n ≤ 100 1 ≤ k ≤ 100 as defined above. For each game, a line follows containing p1, m1, p2, m2. 1 ≤ p1 ≤ n and 1 ≤ p2 ≤ n are distinct integers identifying two players; m1 and m2 are their respective moves ("rock", "scissors", or "paper"). A line containing 0 follows the last test case. 
 

Output
Output one line each for player 1, player 2, and so on, through player n, giving the player's win average rounded to three decimal places. If the win average is undefined, output "-". Output an empty line between cases. 
 

Sample Input
  
  
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
 

Sample Output
  
  
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; }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值