您的位置:首页 > 其它

poj 1167 简单搜索

2013-07-22 12:21 246 查看
这题主要是注意好限定的条件

条件1:每个公交车都至少要到达两次

条件2:公交车相同时间和相同间隔是属于两种车辆

条件3:不同的车可能到达时间相同

上述都是深搜的重要条件:

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using std::sort;
int const N = 1000;
struct node
{
int begin,interval,Count;
bool operator <(const node &tmp)const
{
return Count>tmp.Count;
}
}bus
;
int sum
,n,val,cnt,ans;
int Min(int a,int b)
{
return a<b?a:b;
}
bool judge(int b,int inter)
{
for(int i=b;i<=59;i+=inter)
{
if(sum[i]==0)
return false;
}
return true;
}
void dfs(int t,int num)
{
if(n<=0)
{
ans=Min(num,ans);
return ;
}
for(int i=t;i<cnt;i++)
{
if(num+(n/bus[i].Count)>=ans)return ;
if(judge(bus[i].begin,bus[i].interval))
{
for(int j=bus[i].begin;j<=59;j+=bus[i].interval)
{
sum[j]--;
n--;
}
dfs(i,num+1);
for(int j=bus[i].begin;j<=59;j+=bus[i].interval)
{
sum[j]++;
n++;
}
}
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(sum,0,sizeof(sum));
cnt=0;
for(int i=0;i<n;i++)
{
scanf("%d",&val);
sum[val]++;
}
for(int i=0;i<=29;i++)
{
if(sum[i]==0)continue;
for(int j=i+1;j<=59-i;j++)
{
if(judge(i,j))
{
bus[cnt].begin=i;
bus[cnt].interval=j;
bus[cnt].Count=(59-i)/j+1;
cnt++;
}
}
}
ans=17;
sort(bus,bus+cnt);
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: