b520 - 樂透-商競103
題目描述
題目要求計算兩組樂透號碼(各 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;
}
}