传送带

传送带

成绩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位小数。

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 3↵
  2. 10 1 4 2 2↵
  3. 0 1 1↵
  4. 9 10 1↵
  5. 10 1 4 1000 2↵
  6. 0 1 1↵
  7. 9 10 6↵
  8. 20 1 3 20 5↵
  9. 0 4 5↵
  10. 4 8 4↵
  11. 8 12 3↵
  12. 12 16 2↵
  13. 16 20 1↵
以文本方式显示
  1. 3.000000↵
  2. 2.300000↵
  3. 3.538095↵
1秒64M0


这题原则就是使最小的速度尽可能大,所以优先在传送带外跑
#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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值