poj 2356
http://poj.org/problem?id=2356
方法一: 鸽巢原理
解题思路: n个数,,依次求其s[0],s[1],s[2],s[3]。。。。。s[n] 然后对 n取模,,必然会得到n+1个结果,,这n+1个结果放到0---n-1,这n个盒子中,必然会有重复的,所以这两个重复的之间,必然就是所求的结果。
1 #include <iostream> 2 #include<cstring> 3 using namespace std; 4 int n; 5 int sum [10002]; 6 int s[10002]; 7 int select[10002]; 8 int main() 9 { 10 cin>>n; 11 for(int i=1;i<=n;i++) 12 cin>>s[i]; 13 sum[0]=0; 14 for(int i=1;i<=n;i++) 15 sum[i]=(sum[i-1]+s[i])%n; 16 memset(select,-1,sizeof(select)); 17 for(int i=0;i<=n;i++){ 18 if(select[sum[i]]==-1) 19 select[sum[i]]=i; 20 else{ 21 cout<<i-select[sum[i]]<<endl; 22 for(int j=select[sum[i]]+1;j<=i;j++) 23 cout<<s[j]<<endl; 24 break; 25 } 26 } 27 return 0; 28 }
方法二: 深搜
搜索,还真是强大啊。。虽然比较麻烦,,但是确实基本的解法。。一点更要掌握。
1 #include<iostream> 2 using namespace std; 3 int s[10002]; 4 int n; 5 int cnt; 6 bool dfs(int sum,int cur){ 7 int i; 8 if(sum%n==0&&sum>=n){ 9 cout<<cnt<<endl; 10 return true; 11 } 12 for(i=cur+1;i<=n;i++){ 13 cnt++; 14 if(dfs(sum+s[i],i)){ 15 cout<<s[i]<<endl; 16 return true; 17 } 18 cnt--; 19 } 20 return false; 21 } 22 int main(){ 23 cin>>n; 24 for(int i=1;i<=n;i++) 25 cin>>s[i]; 26 cnt = 0; 27 dfs(0,0); 28 }