Description
小明的飛機快要趕不上了!
幸好大廳的路上有一些傳送帶。每個傳送帶都有一定的速度,傳送帶之間沒有重疊。
小明自己行走的速度爲w,如果傳送帶的速度爲v的話,在傳送帶上走的速度就是w+v。
但是小明還是很着急,所以他決定跑一段時間t。他跑的速度是r,那麼如果傳送帶的速度爲v的話,在傳送帶上跑的速度就是r+v。
對於時間t,他不一定要連續跑,可以走走再跑。也不一定非要跑夠t。
問小明至少需要多少時間才能到達終點。
Input
輸入第一行爲用例數T,1<=T<=40。
每一組用例的第一行包含五個整數:
X:爲大廳的長度,小明起始位於0,終點是X,1<=X<=1000000
W:爲走路的速度
R:爲跑步的速度,1<=W<R<=100
t:最多能跑t秒,1<=t<=1000000
n:傳送帶的個數
接下來的n行,表示n個傳送帶的詳細信息。每行包含三個整數:Bi,Ei,Vi,分別表示傳送帶的起始位置、終止位置和速度,0<=Bi<Ei<=X,1<=vi<=100。任意兩個傳送帶都不相交。
Output
每組用例輸出包含一個數字,表示至少需要多少時間。輸出四捨五入到6位小數。
Sample Input
3
10 1 4 2 2
0 1 1
9 10 1
10 1 4 1000 2
0 1 1
9 10 6
20 1 3 20 5
0 4 5
4 8 4
8 12 3
12 16 2
16 20 1
Sample Output
3.000000
2.300000
3.538095
貪心。分清楚是在傳送帶的時候跑還是平底的時候跑。
// debug.cpp : 定義控制檯應用程序的入口點。
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 1005
typedef struct {
double st, ed, v;
}NODE;
NODE chuan[maxn];
int check_0(double k)
{
if (k > -0.0000001&&k < 0.0000001)
return 1;
return 0;
}
double r, t_rest, w;
double check(double far, double v)
{
double t_fuck;
if (check_0(t_rest))//沒有剩餘跑的時間
{
return (far / (v + w));
}
if ((v + r)*t_rest<far)//不能全用跑的
{
t_fuck = t_rest;
t_rest = 0.0000;
return (t_fuck + (far - t_fuck*(r + v)) / (v + w));
}
t_rest = t_rest - far / (r + v);//全跑
return far / (r + v);
}
int cmp(const void*a, const void*b)
{
return (*(NODE *)a).v - (*(NODE *)b).v;
}
int main(void)
{
double sum_chuan;
int T, n, i;
double far, v, x, t, walk;
double t_cha, ans;
scanf("%d", &T);
while (T--)
{
sum_chuan = 0.0;
scanf("%lf%lf%lf%lf%d", &x, &w, &r, &t, &n);
for (i = 0;i < n;i++)
{
scanf("%lf%lf%lf", &chuan[i].st, &chuan[i].ed, &chuan[i].v);
sum_chuan += (chuan[i].ed - chuan[i].st);
}
qsort(chuan, n, sizeof(chuan[i]), cmp);
walk = x - sum_chuan;
far = walk;v = 0;t_rest = t;
ans = check(far, v);
for (i = 0;i < n;i++)
{
far = chuan[i].ed - chuan[i].st;
v = chuan[i].v;
ans += check(far, v);
}
printf("%.6lf\n", ans);
}
}