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(简单DP)

POJ-2336 Ferry Loading II(简单DP)
  • Dacc123
  • Dacc123
  • 2016年01月09日 14:40
  • 355

POJ 2336 动态规划(DP) Ferry Loading II

题目链接:http://poj.org/problem?id=2336 分析:设想我们要求的是第i辆车最早到达目的地的时间( dp[i] ),则我们只要找到在它之前的n辆车中能最早到达目的地的那...
  • du489380262
  • du489380262
  • 2013年05月03日 21:01
  • 929

poj 2336 Ferry Loading II 贪心

水题,直接贴代码。 //poj 2336 //sep9 #include using namespace std; const int maxN=1600; int a[maxN]; int ma...
  • sepNINE
  • sepNINE
  • 2015年01月04日 21:37
  • 444

POJ 2336 Ferry Loading II 动态规划

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

贪心之 Ferry Loading II (POJ 2336)

Description Before bridges were common, ferries were used to transport cars across rivers. River ...
  • gaotong2055
  • gaotong2055
  • 2013年04月26日 14:18
  • 1008

poj 2336 Ferry Loading II

time[i],0
  • u013486906
  • u013486906
  • 2015年07月13日 22:50
  • 273

uva 10440 Ferry Loading II

uva 10440 Ferry Loading II 题目意思,给定 T 组测试数据,每组测试数据如下 船每次能装 n 辆车 ,来回需要 2*t 时间,m辆车及其到达时间。 求:在最少的次数下的时...
  • a1061747415
  • a1061747415
  • 2014年03月10日 23:06
  • 1189

Ferry Loading II 贪心算法

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

POJ2336 Ferry Loading II 贪心动规

题意:有m辆车,每次最多运n辆过河,过河过去需要t时间回来需要t时间,m辆车一开始并不是都在岸边的,给出m辆车抵达岸边的时间(只有车抵达河岸才能过河),问使得所有车辆过河所需要的最少次数 跟 最早时间...
  • u010682557
  • u010682557
  • 2014年05月07日 22:17
  • 666

POJ 2336 Ferry Loading II (贪心或动态规划)

链接:http://poj.org/problem?id=2336 贪心思想 --- 最早运到对岸的时间,取决于最后来的一辆车的被运送时间,因此最优解即是最后一辆车能够最早被运送; 解法:...
  • u012823258
  • u012823258
  • 2014年04月06日 15:04
  • 954
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2336 Ferry Loading II [贪心 DP]
举报原因:
原因补充:

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