首页 > ACM题库 > HDU-杭电 > HDU 1148 Rock-Paper-Scissors Tournament-线性结构-[解题报告] C++
2013
12-02

HDU 1148 Rock-Paper-Scissors Tournament-线性结构-[解题报告] C++

Rock-Paper-Scissors Tournament

问题描述 :

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 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 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.

样例输入:

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

还没提交。。。

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<fstream>
#include<sstream>
#include<iomanip>
#include <sstream>
using namespace std;

const int N=105;

int player[N][2]; // player[i][0]: win , player[i][1]: lose. 

int n,k;
short judge(string a, string b)
{
	if(a == b)
	{
		return 0;
	}
	short result;
	if(a == "rock")
	{ 
		if(b == "scissors")
		{
			result = 1;
		}
		else if(b == "paper")
		{
			result = -1;
		}
	}
	else if(a == "scissors")
	{
		if(b == "rock")
		{
			result = -1;
		}
		else if(b == "paper")
		{
			result = 1;
		}
	}
	else
	{
		if(b == "scissors")
		{
			result = -1;
		}
		else if(b == "rock")
		{
			result = 1;
		}
	}
	return result;
}
int main()
{
	short ans;
	string sa,sb;
	int pa,pb;
	bool first = true;
	while(cin>>n && n)
	{
		if(!first)putchar('\n');
		if(first)first=false;
		memset(player,0,sizeof(player));
		cin>>k;
		while(k--)
		{
			cin>>pa>>sa>>pb>>sb;
			ans = judge(sa,sb);
			if(ans)
			{
				if(ans==1)//win
				{
					player[pa][0]++;
					player[pb][1]++;
				}
				else//lose
				{
					player[pb][0]++;
					player[pa][1]++;
				}
			}
		}
		for(int i=1; i<=n; i++)
		{
			int total = player[i][0]+player[i][1];
			if(total>0)
			{
				printf("%.3f\n",((float)player[i][0])/total);
			}
			else
			{
				printf("-\n");
			}
		}
	}
	return 0;
}


  1. 嗯 分析得很到位,确实用模板编程能让面试官对你的印象更好。在设置辅助栈的时候可以这样:push时,比较要push的elem和辅助栈的栈顶,elem<=min.top(),则min.push(elem).否则只要push(elem)就好。在pop的时候,比较stack.top()与min.top(),if(stack.top()<=min.top()),则{stack.pop();min.pop();},否则{stack.pop();}.

  2. 第二种想法,我想来好久,为啥需要一个newhead,发现是把最后一个节点一直返回到嘴上面这层函数。厉害,这道题之前没样子想过。