POJ 1167 The Buses

懵逼*(一下午+一晚上)

找到所有可行路线然后枚举暴力找需要车最少的路线方案

dfs代码

By Acer.Mo
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n,time[1000],emm=0,cnt=0,ans=17;
struct edge
{
	int from;
	int to;
	int cost;
}bus[10000];
bool cmp (edge a,edge b)
{
	return a.cost>b.cost;
}
int qlm(int x,int cha)
{
	for (int i=x;i<60;i+=cha)
	{
		if (!time[i]) return 0;
	}
	return 1;
}
int dfs(int x,int num)
{
	if (n<=0)
	{
		ans=min(ans,num);
		return 0;	
	} 
	for (int i=x;i=ans) return 0;
		if (qlm(bus[i].from,bus[i].to))
		{
			for (int k=bus[i].from;k<=59;k+=bus[i].to)
			{
				time[k]--;
				n--;
			}
			dfs(i,num+1);
			for (int k=bus[i].from;k<=59;k+=bus[i].to)
			{
				time[k]++;
				n++;
			}
		}
	}
	return 0;
}

int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&emm);
		time[emm]++;
	}
	for (int i=0;i<30;i++)
	{
		if (!time[i]) continue;
		for (int k=i+1;k<=59-i;k++)
		{
			if (qlm(i,k))
			{
				bus[cnt].from=i;
				bus[cnt].to=k;
				bus[cnt++].cost=(59-i)/k+1;
			}
		}
	}
	sort(bus,bus+cnt,cmp);
	dfs(0,0);
	cout<


你可能感兴趣的:(爆搜)