# Simulation# Data Structure# Greedy

j604 - 10903 - Rock-Paper-Scissors Tournament

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一場石頭剪刀布錦標賽,其中 n 名玩家互相進行 k 次遊戲。目標是計算每個玩家的平均獲勝次數,公式為 w/(w + l),其中 w 是獲勝次數,l 是失敗次數。如果 w + l 為 0,則輸出 "-"。

解題思路

程式碼模擬了錦標賽的過程。它使用兩個陣列 ctwctl 來追蹤每個玩家的獲勝和失敗次數。對於每一場比賽,程式碼會比較兩個玩家的出拳,並根據石頭剪刀布的規則更新對應玩家的獲勝或失敗次數。最後,程式碼計算每個玩家的平均獲勝次數,並將結果輸出到小數點後三位。如果玩家沒有任何獲勝或失敗,則輸出 "-"。

複雜度分析

  • 時間複雜度: O(k * n * (n - 1) + n)。主要的時間花在模擬 k * n * (n - 1) / 2 場比賽上,以及最後計算每個玩家的平均獲勝次數,這需要 O(n) 的時間。
  • 空間複雜度: O(n)。程式碼使用兩個大小為 n + 1 的陣列 ctwctl 來儲存每個玩家的獲勝和失敗次數。

程式碼

#include <bits/stdc++.h>
using namespace std;
int n,k;
int main(){
	cin.tie(0); ios::sync_with_stdio(0);
	for(string sx,sy;cin >> n;cout << "\n"){
		if(n==0)break;
		cin >> k;
		int ctw[101]={},ctl[101]={},x,y;
		for(int i=0;i<k*n*(n-1)/2;++i){
			cin >> x >> sx >> y >> sy;
			if(sx=="rock")
				(sy=="scissors")?++ctw[x],++ctl[y]:(sy=="paper")?++ctl[x],++ctw[y]:0;
			else if(sx=="scissors")
				(sy=="paper")?++ctw[x],++ctl[y]:(sy=="rock")?++ctl[x],++ctw[y]:0;
			else
				(sy=="rock")?++ctw[x],++ctl[y]:(sy=="scissors")?++ctl[x],++ctw[y]:0;
		}
		for(int i=1;i<=n;++i)
			(ctl[i]+ctw[i]==0)?cout << "-\n":cout << fixed << setprecision(3) << (double)ctw[i]/(double)(ctl[i]+ctw[i]) << "\n";
	}
}

Discussion