# Array# Greedy# String Parsing

b520 - 樂透-商競103

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算兩組樂透號碼(各 5 個)之間有多少個號碼是相同的。輸入包含多組測試資料,每組資料包含兩行,分別代表開獎號碼和投注者的號碼,號碼之間以逗號和空格分隔。

解題思路

程式首先讀取測試資料的組數。對於每組資料,程式將開獎號碼和投注者的號碼分別解析成整數陣列。然後,程式使用巢狀迴圈比較兩個陣列中的每個元素。如果找到相同的號碼,則計數器增加,並且將開獎號碼陣列中對應的元素設為 -1,以避免重複計算。最後,程式輸出每組資料的匹配號碼數量。

複雜度分析

  • 時間複雜度: O(n^2),其中 n 是每組資料中號碼的數量(在本例中為 5)。這是因為使用了巢狀迴圈來比較兩個陣列。
  • 空間複雜度: O(n),其中 n 是每組資料中號碼的數量(在本例中為 5)。這是因為程式使用了兩個大小為 5 的整數陣列來儲存開獎號碼和投注者的號碼。

程式碼

#include <iostream>
#include <string>
using namespace std;
int main(){
	string a,b;
	getline(cin,a);
	while(getline(cin,a)){
		int ans=0,aa[5]={},bb[5]={};
		getline(cin,b);
		for(int i=0,k=0;i<a.length();i++){
			if(a[i]!=','&&a[i]!=' '){
				aa[k]+=a[i]-48;
				i++;
				aa[k]*=10;
				aa[k]+=a[i]-48;
				k++;
			}
		}
		for(int i=0,k=0;i<b.length();i++){
			if(b[i]!=','&&b[i]!=' '){
				bb[k]+=b[i]-48;
				i++;
				bb[k]*=10;
				bb[k]+=b[i]-48;
				k++;
			}
		}
		for(int i=0;i<5;i++){
			for(int j=0;j<5;j++){
				if(aa[i]==bb[j]){
					ans++;
					aa[i]=-1;
				}
			}
		}
		cout << ans << endl;
	}
}

Discussion