admin 管理员组文章数量: 887021
传送带
传送带
成绩 | 10 | 开启时间 | 2017年09月8日 星期五 10:00 |
折扣 | 0.8 | 折扣时间 | 2017年09月15日 星期五 23:00 |
允许迟交 | 否 | 关闭时间 | 2017年10月10日 星期二 00:05 |
小明的飞机快要赶不上了!
幸好大厅的路上有一些传送带。每个传送带都有一定的速度,传送带之间没有重叠。
小明自己行走的速度为w,如果传送带的速度为v的话,在传送带上走的速度就是w+v。
但是小明还是很着急,所以他决定跑一段时间t。他跑的速度是r,那么如果传送带的速度为v的话,在传送带上跑的速度就是r+v。
对于时间t,他不一定要连续跑,可以走走再跑。也不一定非要跑够t。
问小明至少需要多少时间才能到达终点。
输入第一行为用例数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。任意两个传送带都不相交。
输出包含一个数字,表示至少需要多少时间。输出四舍五入到6位小数。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
这题原则就是使最小的速度尽可能大,所以优先在传送带外跑
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 1000005
typedef struct Node {int b;int e;double v;
}node;
node pa[maxn];
int cmp(const void *a, const void *b) {node *c = (node *)a;node *d = (node *)b;return c->v - d->v;
}
int main() {int T;scanf("%d", &T);double x, w, r, t, n;while (T--) {scanf("%lf %lf %lf %lf %lf", &x, &w, &r, &t, &n);double road = x;;for (int i = 0; i < n; i++) {scanf("%d %d %lf", &pa[i].b, &pa[i].e, &pa[i].v);road = road - pa[i].e + pa[i].b;}qsort(pa, n, sizeof(pa[0]), cmp);if (road / r >= t) {road -= t*r;t += road / w;for (int i = 0; i < n; i++) {t += (pa[i].e - pa[i].b) / (pa[i].v+w);}printf("%.6lf\n", t);}else {double t1 = t - road / r;double ans = road / r;for (int i = 0; i < n; i++) {if (t1 <= 0) {ans += (pa[i].e - pa[i].b) / (pa[i].v+w);}else if ((r + pa[i].v)*t1 > pa[i].e - pa[i].b) {ans += (pa[i].e - pa[i].b) / (r + pa[i].v);t1 = t1 - (pa[i].e - pa[i].b) / (r + pa[i].v);}else {double s = (pa[i].v + r)*t1;ans += t1 + (pa[i].e - pa[i].b - s) / (pa[i].v+w);t1 = 0;}}printf("%.6lf\n", ans);}}return 0;
}
本文标签: 传送带
版权声明:本文标题:传送带 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687815960h144891.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论