計蒜客: T2077 珠心算測驗以及T1195和數

題目鏈接:珠心算測驗

解題思路:枚舉所有符合條件的,但是要注意去重。比如測試樣例有四種符合條件的數據,但是其中有重複的,雖然滿足:加數和被加數必須是集合中的兩個不同的數。有兩種方法,其實思路差不多。但是注意題目中說集合中的數各不相同,如果將條件改爲集合中的數可以相同(比如這個題目計蒜客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;
	
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章