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 }
View Code

 

posted @ 2013-07-22 12:21  诺小J  阅读(278)  评论(0编辑  收藏  举报