POJ 2336 Ferry Loading II [贪心 DP]

原创 2012年03月23日 22:45:25

题意:

摆渡:每次可以摆渡n辆车,摆渡要来回的,去和返的时间一样都是t,有m辆车需要摆渡。

这m辆车抵达码头的时间给定。

问如果摆渡,可以使摆渡完所有的车的时间最少。

且输出这个条件下,最少的来回数。


思路:

贪心+dp。

现在要满足总时间最少,则最晚抵达的车要尽早摆渡过岸。

假设最晚抵达的车,车号为m的时间为 40。

则最后一趟摆渡出发的时间可以是t>=40的区间都可以.但是当然 t 越小越好。


先进行一下贪心:

因为每次摆渡可以运n辆车,则最后一车的时候还可以一起顺带n-1辆车。

怎么选这n-1辆车呢?显然是m-1,m-2...m-n+1一起。

因为越后面的车辆,摆渡的时间容许度越苛刻。如果


m-2,10.

m-1,30.

m,40.

对于m-2可以在>=10的时间内摆渡,m-1可以在>=30的时间内摆渡。

m-1的摆渡时间 真包含于 m-2的摆渡时间。

所以将m-1顺带带走显然比带走m-2的车更佳,起码不会更坏。


然后是dp的转移方程:

dp[i]=Max(dp[i-n]+2*t,a[i]);

注意就是这里dp[i]的i是从m开始,i=m,i=m-n,i=m-2*n....按每n个车作为一个集合来处理的。

最后一个集合有可能不足n辆车。

因为m%n不一定等于0.


先写的上面这些思路,再写的下面的代码。

一次AC,没啥陷阱。


#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<cmath>
#include<algorithm>
#define llong long long
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)
#define Abs(a) ((a)>0?(a):-(a))
#define Mod(a,b) (((a)-1+(b))%(b)+1)
using namespace std;
int n,m,t;
const int N=1505;
const int M=105;
const int inf=2099999999;
int a[N];
int dp[N];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		memset(dp,0,sizeof(dp));
		scanf("%d%d%d",&n,&t,&m);
		for(int i=1;i<=m;i++)
			scanf("%d",a+i);
		int now=m%n,count=1;
		if(!now)
		{
			now=n;
		}
		dp[now]=a[now];
		now+=n;
		while(now<=m)
		{
			count++;
			dp[now]=Max(dp[now-n]+2*t,a[now]);
			now+=n;
		}
		printf("%d %d\n",dp[m]+t,count);
	}
	
	return 0;
}


相关文章推荐

POJ 2336 Ferry Loading II 动态规划

来源 Waterloo local 2003.01.25 题目描述 给了一艘船,该船一次性可运输n辆车,过去需要t分钟(返回亦然)。一共有m辆车需要运输,接下来m行给出每辆车到达港口...
  • Sci_M3
  • Sci_M3
  • 2016年05月24日 16:29
  • 308

POJ 2336 Ferry Loading II(运车过河的最短时间和次数)

Ferry Loading II Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4042 ...

Ferry Loading II 贪心算法

Description 一条船能够一次最多渡n辆车过河,过河用t分钟,回来又要用t分钟。m辆车按照一定的计划到达岸边。现在要求最少用多少时间将所有的船渡过河,以及最少用多少次来将所有的车渡过河。 ...

ZQUOJ1393 Ferry Loading II 解题报告

Ferry Loading IImemory limit: 65536KB time limit: 500MSaccept: 9 submit: 20DescriptionBefore bridges...
  • eapink
  • eapink
  • 2011年05月17日 18:46
  • 540

POJ 3282 Ferry Loading IV(模拟,队列)

题意   汽车通过渡船过河  渡船开始在左边   输入按车辆来的顺序输入河两岸的车   渡船每次运输的汽车的总长度不能超过渡船自己本身的长度  先来的车先走   求轮船至少跨河多少次才能将所有的车辆都...

UVA 10901 Ferry Loading III 队列模拟

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=...

UVa Problem 10261 Ferry Loading (渡船装载)

// Ferry Loading (渡船装载) // PC/UVa IDs: 111106/10261, Popularity: B, Success rate: low Level: 3 // Ve...

programming-challenges Ferry Loading (111106) 题解

这道题做得很郁闷,思路很好懂,可是做得时候总是出问题,到现在也不知道最开始那种写法问题在什么地方。 #include #include #include #include #include ...

hdu 2336 无题II 【二分+二分匹配】

无题II Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm...

poj 2336

这题题意是用船把m辆车载过河,每辆车到码头的时间不同,来回一次要时间2t,每一次可以载n辆车;一眼看过去好像有三个状态,关键是车,但是还有个趟数,其实就是相当于记录路径,那么这题就简单了,每辆车可以和...
  • xymscau
  • xymscau
  • 2011年08月09日 12:46
  • 750
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2336 Ferry Loading II [贪心 DP]
举报原因:
原因补充:

(最多只允许输入30个字)