传送带问题

问题描述

小明的飞机快要赶不上了!

幸好大厅的路上有一些传送带。每个传送带都有一定的速度,传送带之间没有重叠。

小明自己行走的速度为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. 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秒 64M 0

题解思路

大致思路:

要想使时间最短,尽量在速度小的传送带上跑(可以把没有传送带的地方看做是速度为0的传送带)。然后进行逐次的累计时间即可。

思路证明:

对于所有的路程来说,速度的范围是在0~100之间的,根据时间公式t=s/v,因为s是一定的,所以就看怎么处理v的问题。如果人是静止的,那么人要走完这段路程所需要的时间就是各个速度的传送带的长度除以各个传送带的速度。那么对于地面来说需要的时间就是正无穷(相当于除以0)。然后下面我们就把跑步的速度(因为随时都可以走,所以这个地方可以先忽略走路的速度)加在上面每个速度段的速度上,看怎么加完之后所用的总时间减少的最多。极端的想法可以有三种:一,优先从速度小的加,即从速度为0的传送带加,这样的话无论跑步的速度为多大,加完之后的时间会从正无穷减小到一个有限的数,时间减小是无穷倍的;二,优先从速度大的传送带上加,这样的话,如果传送带的速度比人跑的速度大的话,那么时间减小的量不会超过1倍;三,优先从中间的速度加,这样的话,无论跑步的速度比传送带的速度大还是小最后时间减小的倍数都是一个有限值;对比这三种方法,只有第一种时间的减小量是一个无限值,所以尽量在速度小的传送带上跑是最省时间的。

具体实现方式:

把各个传送带的长度按速度的大小进行分类存储,把速度相同的传送带合并在一起(输入传送带的三个信息,qidian,zhondian,speed,l令sp[0]=总路程,读入的时候可以这样读入{sp[speed]+=zhongdian-qidian;sp[0]-=zhongdian-qidian;}),然后根据能跑步的时间进行比较,讨论,累和。对于每一截传送带首先要进行判断,判断可以跑步的时间是否可以将这一节传送带跑完(判断的方法就是用跑步和传送带本身的速度之和乘以可以跑步的时间),如果可以跑完那这一节的时间久可以直接用这一节的长度除以传送带和跑步的速度之和,然后可以跑步的时间再减去跑这一节所用的时间({time+=sp[j]/(r+j);t-=sp[j]/(r+j);})。如果跑不完的话,就把这一节的长度分为两段,一段时在传送带上跑,一段是在传送带上走,分别计算时间,计算完了之后把能跑步的时间清为0。{time+=(sp[j]-t*(r+j))/(j+w)+t;t=0;}这样通过一次循环就可以处理掉所有的情况,但是在处理的时候要注意:1,因为最后的结果是保留6位小数的,所以在计算时间的时候可以有两种处理方法,一是使用强制转换,计算的时候转换为实型的数;另一种方法就是在定义累计传送带速度的数组时定义为double型的数组。2,在每次大循环的时候注意要把存储长度的数组清0.

代码实现

#include<stdio.h>
int main()
{
	int n,T,w,r;
	double sp[101];
	double time,x,t;
	int temp1,temp2,temp3;
	int i,j;

	scanf("%d",&T);
	for(i=0;i<T;i++)
	{
		time=0;
		for(j=0;j<101;j++)
		{
			sp[j]=0;
		}
		scanf("%lf%d%d%lf%d",&x,&w,&r,&t,&n);
		sp[0]=x;
		for(j=0;j<n;j++)
		{
			scanf("%d%d%d",&temp1,&temp2,&temp3);
			sp[temp3]+=temp2-temp1;
			sp[0]-=temp2-temp1;
		}
		for(j=0;j<101;j++)
		{
			if(sp[j]!=0&&t*(r+j)>sp[j])
			{
				time+=sp[j]/(r+j);
				t-=sp[j]/(r+j);
			}
			else if(sp[j]!=0)
			{
				time+=(sp[j]-t*(r+j))/(j+w)+t;
				t=0;
			}
			else
			;
		}
		printf("%.6lf\n",time);

	}
	return 0;
}
时间: 2024-08-29 01:16:55

传送带问题的相关文章

【Bootstrap】3.优化站点资源、完成响应式图片、让传送带支持手势

A.优化站点资源 速度很重要.用户很关心.我们的站点必须加载够快,否则用户就会走人.SEO 也很重要.我们的站点必须加载够快,否者搜索排名就会下降. 明白了这样,我们就来清点一下 [Bootstrap]2.作品展示站点 中的资源.特别的,来看一看我们能控制的.影响页面速度的重要因素 —— 文件大小,包括图片.CSS和 JavaScript 文件.只要简单几步,我们就可以给这些文件“瘦身”,缩短加载时间. A.1 优化图片 这些图片都通过 Photoshop 的 “保存为 Web 格式” 进行了一

bzoj1857: [Scoi2010]传送带

Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点,他想知道最少需要走多长时间 Input 输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,R Output 输出数据为一行,表示lxhgww

【bzoj1857】传送带——三分套三分

我的第一道三分题目. 早上跟着cyc学了一下三分,晚上想练一下手发现没什么水题就找到了这一道2333 主要是证明是一个单峰函数,这也是本题最难的部分(网上好多人写出来但不会证明:)) 证明过程来自yyl dalao: 本题要讨论必使r<max(q,p),否则还要走什么传送带... 从A点出发,要使解最优,必定要走A->E->F->D,其中E是AB上一点,F为CD上一点. 因为E和F都是不确定的,我们不妨假设E点已经确定,那么CD上必定存在一点F使得EF和FD最优(先不考虑AE),那

bzoj 1857: [Scoi2010]传送带 三分

题目链接 1857: [Scoi2010]传送带 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 934  Solved: 501[Submit][Status][Discuss] Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点,他想知道最少需要走多长时间 Inpu

传送带(bzoj 1857)

Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点,他想知道最少需要走多长时间 Input 输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,R Output 输出数据为一行,表示lxhgww

【BZOJ 1857】 [Scoi2010]传送带

1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 737 Solved: 387 [Submit][Status][Discuss] Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点,他想知道最少需要走多长时间 Input 输入数

工业机器人_传送带与码垛

一.滑块 1.建立一个组件名为滑块 2.在组件滑块里面添加7个组件 (1) (2) (3) (4) 将传感器检测取消 (5) (6) (7) 2.添加两个信号 di1,do2 3.设计连线,仿真 传送带完成 二.夹具 1.新建一个组件名为夹具 2.安装拆除工具夹具 设为role 3.添加组件 (1) (2) (3) (4) (5) 4.连线 三.添加工作站逻辑 1. 2. 仿真完成

【BZOJ-1857】传送带 三分套三分

1857: [Scoi2010]传送带 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1077  Solved: 575[Submit][Status][Discuss] Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点,他想知道最少需要走多长时间 Input 输入

BZOJ 1857 传送带 (三分套三分)

在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点,他想知道最少需要走多长时间 Input输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,ROutput输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留