# String# Greedy# Simulation

j244 - 111北二3a.兌獎問題

🔗 前往 ZeroJudge 原題

題目描述

題目給定三個中獎號碼 a, b, cn 個購買的號碼 s。對於每個購買的號碼,計算其與三個中獎號碼的差異,並根據差異程度給予不同的獎金。目標是計算所有購買號碼的總獎金。

解題思路

這題的核心是比較每個購買的號碼 s 與三個中獎號碼 a, b, c 的差異。比較差異的方式是從最高位開始,直到找到第一個不同的位數。差異的程度由第一個不同位數的位置決定。程式碼使用迴圈迭代每個購買的號碼,並使用三個迴圈分別與三個中獎號碼進行比較。t 變數記錄了最大差異程度,然後根據 t 的值給予相應的獎金。獎金的計算是貪婪的,即根據差異程度選擇最高的獎金。

複雜度分析

  • 時間複雜度: O(n * k * 3) = O(n * k),其中 n 是購買號碼的數量,k 是號碼的長度。
  • 空間複雜度: O(k),主要用於儲存中獎號碼和購買號碼的字串。

程式碼

#include <iostream>
using namespace std;
int n,k;
long long ans;
string a,b,c,s;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> k >> n >> a >> b >> c;
	a='o'+a;
	b='o'+b;
	c='o'+c;
	while(n--){
		cin >> s;
		s='x'+s;
		int t=0;
		for(int i=k;i>=0;--i){
			if(s[i]!=a[i]){
				t=max(t,k-i);
				break;
			}
		}
		for(int i=k;i>=0;--i){
			if(s[i]!=b[i]){
				t=max(t,k-i);
				break;
			}
		}
		for(int i=k;i>=0;--i){
			if(s[i]!=c[i]){
				t=max(t,k-i);
				break;
			}
		}
		if(t==k){
			ans+=500000;
		}
		else if(t>=k-2){
			ans+=10000;
		}
		else if(t>=k-4){
			ans+=1000;
		}
		else if(t>=3){
			ans+=300;
		}
	}
	cout << ans;
}

Discussion