ACM 377. 護衛隊(dp)

377. 護衛隊

★☆   輸入文件:convoy.in   輸出文件:convoy.out   簡單對比
時間限制:1 s   內存限制:128 MB
護衛車隊在一條單行的街道前排成一隊,前面河上是一座單行的橋。因爲街道是一條單行道,所以任何車輛都不能超車。橋能承受一個給定的最大承載量。爲了控制橋上的交通,橋兩邊各站一個指揮員。護衛車隊被分成幾個組,每組中的車輛都能同時通過該橋。當一組車隊到達了橋的另一端,該端的指揮員就用電話通知另一端的指揮員,這樣下一組車隊才能開始通過該橋。每輛車的重量是已知的。任何一組車隊的重量之和不能超過橋的最大承重量。被分在同一組的每一輛車都以其最快的速度通過該橋。一組車隊通過該橋的時間是用該車隊中速度最慢的車通過該橋所需的時間來表示的。問題要求計算出全部護衛車隊通過該橋所需的最短時間值。
 
輸入
輸入文件第一行包含三個正整數(用空格隔開),第一個整數表示該橋所能承受的最大載重量(用噸表示);第二個整數表示該橋的長度(用千米表示);第三個整數表示該護衛隊中車輛的總數(n<1000)。接下來的幾行中,每行包含兩個正整數W和S(用空格隔開),W表示該車的重量(用噸表示),S表示該車過橋能達到的最快速度(用千米/小時表示)。車子的重量和速度是按車子排隊等候時的順序給出的。
 
輸出
輸出文件應該是一個實數,四捨五入精確到小數點後1位,表示整個護衛車隊通過該橋所需的最短時間(用分鐘表示)。
 
輸入樣例
 
100 5 10
40 25
50 20
50 20
70 10
12 50
9 70
49 30
38 25
27 50
19 70
 
輸出樣例
75.0

注意使用long long
#include <iostream>
#include <cstdio>

using namespace std;

#define MAX_N 1000
#define INF 9999999999999999

long long w,s,n;
double dp[MAX_N];
long long we[MAX_N],ve[MAX_N];

int main()
{
	freopen("convoy.in","r",stdin);
	freopen("convoy.out","w",stdout);

	scanf("%ld%ld%ld",&w,&s,&n);

	for(int i=1;i<=n;i++)
		scanf("%ld%ld",&we[i],&ve[i]);

	for(int i=1;i<=n;i++)
	{
		dp[i]=INF;
		long long sumwe=0;
		double minv=INF;
		for(int j=i;j>=1 && sumwe+we[j]<=w;j--)
		{
			sumwe+=we[j];
			minv=min(minv,ve[j]/60.0);
			dp[i]=min(dp[i],dp[j-1]+s/minv);
		}
	}

	printf("%.1lf\n",dp[n]);

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章