題目鏈接:珠心算測驗
解題思路:枚舉所有符合條件的,但是要注意去重。比如測試樣例有四種符合條件的數據,但是其中有重複的,雖然滿足:加數和被加數必須是集合中的兩個不同的數。有兩種方法,其實思路差不多。但是注意題目中說集合中的數各不相同,如果將條件改爲集合中的數可以相同(比如這個題目計蒜客T1195:和數)那麼第一種方法就不再適用,因爲如果測試樣例是2 2 1 1,那麼兩個2都滿足條件,第一種方法就不適用了,只能用第二種方法解決。
第一種方法需要開一個數組(注意數組的大小,太小了容易被卡數據。)將相同的結果出現的次數保存在數組中方便去重。最後輸出去重之後的結果。解題的方法有很多,如果有更好的解題方法歡迎評論!
第一種寫法(只適合T2077)
#include<iostream>
using namespace std;
int main(){
int n,arr[101] = {0},sum[10001] = {0};
//注意數組的範圍大小,不要開的太小被卡測試樣例
int s;
int count = 0; //用來計數有多少個符合條件的
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
//枚舉,注意去重
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if(arr[i] == arr[j]+arr[k] && i!=j && i!=k && j!=k){
//cout<<arr[i]<<" "<<arr[j]<<" "<<arr[k]<<endl;
s = arr[j]+arr[k];
sum[s]++; //將相同的結果出現的次數保存在數組中方便去重
}
}
}
}
for(int i=0;i<10001;i++){
if(sum[i]!=0){
count++;
}
}
cout<<count;
return 0;
}
另一種寫法(兩個題目都可以AC):
#include<iostream>
using namespace std;
int main(){
int n,arr[101] = {0},sum[101] = {0};
int s;
int count = 0; //用來計數有多少個符合條件的
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
//枚舉
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if(sum[i] != 1 && arr[i] == arr[j]+arr[k] && i!=j && i!=k && j!=k){
//cout<<arr[i]<<" "<<arr[j]<<" "<<arr[k]<<endl;
count++;
sum[i] = 1; //如果符合條件,就將該位置標記
}
}
}
}
cout<<count;
return 0;
}