poj 1167 简单搜索
这题主要是注意好限定的条件
条件1:每个公交车都至少要到达两次
条件2:公交车相同时间和相同间隔是属于两种车辆
条件3:不同的车可能到达时间相同
上述都是深搜的重要条件:
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<cmath> 7 using std::sort; 8 int const N = 1000; 9 struct node 10 { 11 int begin,interval,Count; 12 bool operator <(const node &tmp)const 13 { 14 return Count>tmp.Count; 15 } 16 }bus[N]; 17 int sum[N],n,val,cnt,ans; 18 int Min(int a,int b) 19 { 20 return a<b?a:b; 21 } 22 bool judge(int b,int inter) 23 { 24 for(int i=b;i<=59;i+=inter) 25 { 26 if(sum[i]==0) 27 return false; 28 } 29 return true; 30 } 31 void dfs(int t,int num) 32 { 33 if(n<=0) 34 { 35 ans=Min(num,ans); 36 return ; 37 } 38 for(int i=t;i<cnt;i++) 39 { 40 if(num+(n/bus[i].Count)>=ans)return ; 41 if(judge(bus[i].begin,bus[i].interval)) 42 { 43 for(int j=bus[i].begin;j<=59;j+=bus[i].interval) 44 { 45 sum[j]--; 46 n--; 47 } 48 dfs(i,num+1); 49 for(int j=bus[i].begin;j<=59;j+=bus[i].interval) 50 { 51 sum[j]++; 52 n++; 53 } 54 } 55 } 56 } 57 int main() 58 { 59 while(~scanf("%d",&n)) 60 { 61 memset(sum,0,sizeof(sum)); 62 cnt=0; 63 for(int i=0;i<n;i++) 64 { 65 scanf("%d",&val); 66 sum[val]++; 67 } 68 for(int i=0;i<=29;i++) 69 { 70 if(sum[i]==0)continue; 71 for(int j=i+1;j<=59-i;j++) 72 { 73 if(judge(i,j)) 74 { 75 bus[cnt].begin=i; 76 bus[cnt].interval=j; 77 bus[cnt].Count=(59-i)/j+1; 78 cnt++; 79 } 80 } 81 } 82 ans=17; 83 sort(bus,bus+cnt); 84 dfs(0,0); 85 printf("%d\n",ans); 86 } 87 return 0; 88 }