2013-BIT程序设计 5.传送带 -- 排序

5.传送带

小明的飞机快要赶不上了!
幸好大厅的路上有一些传送带。每个传送带都有一定的速度,传送带之间没有重叠。
小明自己行走的速度为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.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.53


分析:将地面看做是速度为0的传送带,最佳策略是 从速度最小的传送带开始跑,直到跑的时间用完,之后再走。计算时间即可。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1000005
struct csd{
	double s;
	double v;
}dd[MAX];
int cmp(const void *a,const void *b)
{
	struct csd *x = (struct csd*)a;
	struct csd *y = (struct csd*)b;
	return x->v > y->v;
}
int main()
{
	int T;
	double w,r,t,tmps,x;
	int n;
	int b,e;
	scanf("%d",&T);
	while (T--)
	{
		tmps = 0.0;
		scanf("%lf%lf%lf%lf%d",&x,&w,&r,&t,&n);
		for (int i = 0; i < n; i++)		{
			scanf("%d%d%lf",&b,&e,&dd[i].v);
			dd[i].s = e-b;
			tmps += dd[i].s;
		}
		dd[n].s = x - tmps;dd[n].v = 0.0;
		qsort(dd,n+1,sizeof(dd[0]),cmp);
		double ans = 0.0;
		double tt = t,ts = 0;
		for (int i = 0; i <= n; i++)//在传送带上的过程
		{
			if(tt == 0.0)			
				ans += (dd[i].s)/(dd[i].v+w);			
			else if(tt*(dd[i].v+r) < (dd[i].s))//跑不全传送带
			{
				ans += tt;
				ts = dd[i].s-tt*(dd[i].v+r);//传送带上剩下的距离
				tt -= tt;				
				ans += ts/(dd[i].v+w);//在传送带上 走 的时间
			}else{//剩余的时间还够跑全这一个传送带
				ans += (dd[i].s)/(dd[i].v+r);
				tt -= (dd[i].s)/(dd[i].v+r);
			}
		}
		printf("%.6lf\n",ans);
	}
	return 0;
}


 

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值