PKU 2654-Rock-Paper-Scissors Tournament

問題概要

N人の人間でk*n*(n-1)/2回ジャンケンをした.
各人間の勝率を求めよ.
ただしあいこの場合は勝負に含まれず,一度も勝負していない場合は"-"と出力せよ.

解法

実装する.

実装(C++)

#include <cstdio>
#include <algorithm>
using namespace std;

inline int getno(const char *s){
	if(s[0]=='r')return 0;
	if(s[0]=='p')return 1;
	if(s[0]=='s')return 2;
}
int main() {
	int n,k,start=0;
	for(;~scanf("%d%d",&n,&k);){
		if(n==0)break;
		if(start++)puts("");
		int cnt=k*n*(n-1)/2;
		int p1,p2;
		char m1[10],m2[10];
		int n1,n2;
		int win[n],lose[n];
		fill(win,win+n,0);fill(lose,lose+n,0);
		for(int i=0;i<cnt;i++){
			scanf("%d%s%d%s",&p1,m1,&p2,m2);
			p1--;p2--;
			n1=getno(m1);n2=getno(m2);
			if((n2+1)%3==n1){
				win[p1]++;lose[p2]++;
			}
			if((n1+1)%3==n2){
				win[p2]++;lose[p1]++;
			}
		}
		for(int i=0;i<n;i++){
			if(win[i]+lose[i]==0){
				puts("-");
			}else{
				printf("%.3f\n",win[i]/(double)(win[i]+lose[i]));
			}
		}
	}
	return 0;
}