# Greedy# Simulation# Array

e592 - 10142 - Australian Voting

🔗 前往 ZeroJudge 原題

題目描述

題目描述了澳大利亞的投票系統,選民需要對候選人進行排名。程式需要模擬這個投票過程,直到有候選人獲得超過 50% 的選票,或者所有候選人並列。

解題思路

程式使用貪心策略模擬投票過程。首先,計算每個候選人獲得的第一順位選票數量。如果某個候選人獲得超過 50% 的選票,則該候選人獲勝。否則,找出獲得選票最少的候選人,並將其淘汰。然後,更新選票,將淘汰候選人之後的候選人順序往前移動。重複此過程,直到有候選人獲勝或所有候選人並列。

複雜度分析

  • 時間複雜度: O(n * m * k),其中 n 是候選人數量,m 是選票數量,k 是每張選票的長度(最多為候選人數量)。
  • 空間複雜度: O(n * m),主要用於儲存選票數據。

程式碼

#include <bits/stdc++.h>
using namespace std;
int t,n,v[1005][25],sz;
string a[25],s;
int main(){
	cin.tie(0); ios::sync_with_stdio(0);
	for(cin >> t;t--;){
		cin >> n;
		int wa[25]={};
		getline(cin,s);
		for(int i=0;i<n;++i)
			getline(cin,a[i]);
		memset(v,0,sizeof(v));
		for(;getline(cin,s)&&s.size();++sz){
			stringstream ss(s);
			for (int i=0;i<n;++i)
				ss >> v[sz][i];
		}
		for(int re=n;re>0;){
			int fr[25]={},mi=1e9,ma=-1e9,num=0,id,buf[25];
			for(int i=0;i<sz;++i)
				for(int j=0;j<n;++j)
					if(wa[v[i][j]-1]==0){
						fr[v[i][j]-1]++;
						break;
					}
			for(int i=0;i<n;++i)
				if(wa[i]==0){
					mi=min(mi,fr[i]);
					if(fr[i]>ma){
						id=i;
						buf[0]=i;
						num=1;
						ma=fr[i];
					}
					else if(fr[i]==ma)
						buf[num++]=i;
				}
			if(num==re||ma*2>sz){
				for(int i=0;i<num;++i)
					cout << a[buf[i]] << "\n";
				break;
			}
			for(int i=0;i<n;++i)
				if(wa[i]==0&&fr[i]==mi)wa[i]=1,--re;
		}
		if(t)cout << "\n";
	}
}

Discussion