神O和神牛

神O和神牛_第1张图片

神O和神牛_第2张图片

神O和神牛_第3张图片

神O和神牛_第4张图片

神O和神牛_第5张图片

神O和神牛_第6张图片

这是一道状压dp题

dp[i]表示状态为i时最小的时间

那么我们考虑什么时候可以办护照

就是下机和登机的那个时间,那么我们枚举这一次办哪个签证,再找一下他能放的最靠前的位置就可以了

如果我们能够把签证办理时间排序,可以发现最优位置单调不降,那么就可以O(2^n*n)做出这道题了

代码写炸了好几次,还看错了题,实际上也不难

#include
#include
using namespace std;
struct node
{
	int s,len,t,ans,kind,id;
}a[25];
bool cmps(const node &a,const node &b)
{
	return a.sgetport)
				{
					if(a[k].s<=getport)getport=a[k].s+a[k].len;
					else if(((i>>(k-1))&1)&&a[k].s<=getport+a[j].t)getport=a[k].s+a[k].len;
					else if(a[k].s>getport+a[j].t)break;
				}	
			if(getport+a[j].t>=a[j].s)continue;
			if(dp[nxt]>getport+a[j].t)
			{
				dp[nxt]=getport+a[j].t;
				pre[nxt]=i;
			}
		}
	}
	if(p==2)
	{
		for(register int i=0;i<=all;i++)
		{
			if(dp[i]

 

你可能感兴趣的:(dp,思路题)