您的位置:首页 > 其它

BIT2014级软件学院程序设计-08传送带

2016-03-02 15:19 176 查看

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: