# Simulation# Greedy

d835 - NOIP2003 1.乒乓球

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬乒乓球比賽,根據輸入的 W (華華得分) 和 L (對手得分) 記錄,分別計算 11 分制和 21 分制下的比賽結果。比賽結束的標記是 E。輸出格式為每局比賽的比分,兩套規則的結果之間用空行分隔。

解題思路

這題的核心是模擬比賽過程,並根據不同的規則判斷一局是否結束。程式使用兩個二維陣列 ab 分別記錄 11 分制和 21 分制下華華和對手的得分情況。程式逐個讀取輸入的 W、L 或 E,更新對應陣列中的得分。判斷一局是否結束的條件是:得分達到 11 或 21 分,且領先對手至少 2 分。如果一局結束,則增加對應陣列的索引,開始記錄下一局的得分。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。程式需要遍歷輸入字串一次。
  • 空間複雜度: O(n),因為陣列 ab 的大小為 10001,最壞情況下可能需要存儲 n 局比賽的結果。

程式碼

#include <iostream>
using namespace std;
int a[10001][2],b[10001][2],ita,itb;
char c;
int main(){
	while(cin >> c){
		if(c=='W'){
			++a[ita][0];
			++b[itb][0];
			if(a[ita][0]>=11&&a[ita][0]-a[ita][1]>=2)
				++ita;
			if(b[itb][0]>=21&&b[itb][0]-b[itb][1]>=2)
				++itb;
		}
		else if(c=='L'){
			++a[ita][1];
			++b[itb][1];
			if(a[ita][1]>=11&&a[ita][1]-a[ita][0]>=2)
				++ita;
			if(b[itb][1]>=21&&b[itb][1]-b[itb][0]>=2)
				++itb;
		}
		else if(c=='E')
			break;
	}
	for(int i=0;i<=ita;++i)
		cout << a[i][0] << ":" << a[i][1] << "\n"; 
	cout << "\n";
	for(int i=0;i<=itb;++i)
		cout << b[i][0] << ":" << b[i][1] << "\n"; 
}

Discussion