hdu 6581 Vacation【思维】

Vacation
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Special Judge

Problem Description
Tom and Jerry are going on a vacation. They are now driving on a one-way road and several cars are in front of them. To be more specific, there are n cars in front of them. The ith car has a length of li, the head of it is si from the stop-line, and its maximum velocity is vi. The car Tom and Jerry are driving is l0 in length, and s0 from the stop-line, with a maximum velocity of v0.
The traffic light has a very long cycle. You can assume that it is always green light. However, since the road is too narrow, no car can get ahead of other cars. Even if your speed can be greater than the car in front of you, you still can only drive at the same speed as the anterior car. But when not affected by the car ahead, the driver will drive at the maximum speed. You can assume that every driver here is very good at driving, so that the distance of adjacent cars can be kept to be 0.
Though Tom and Jerry know that they can pass the stop-line during green light, they still want to know the minimum time they need to pass the stop-line. We say a car passes the stop-line once the head of the car passes it.
Please notice that even after a car passes the stop-line, it still runs on the road, and cannot be overtaken.

Input
This problem contains multiple test cases.
For each test case, the first line contains an integer n (1≤n≤105,∑n≤2×106), the number of cars.
The next three lines each contains n+1 integers, li,si,vi (1≤si,vi,li≤109). It‘s guaranteed that si≥si+1+li+1,∀i∈[0,n−1]

Output
For each test case, output one line containing the answer. Your answer will be accepted if its absolute or relative error does not exceed 10−6.
Formally, let your answer be a, and the jury‘s answer is b. Your answer is considered correct if |a−b|max(1,|b|)≤10−6.
The answer is guaranteed to exist.

Sample Input
1
2 2
7 1
2 1
2
1 2 2
10 7 1
6 2 1

Sample Output
3.5000000000
5.0000000000

题意:n辆车按前后顺序在一条单行道上行驶,若后一辆车碰到了前一辆车的尾巴,也必须按前一辆车的速度行驶,不能超越,按离终点距离从大到小的顺序给你n+1辆车的车身长,车头离终点距离,和各自的速度(你是离终点最远的那一辆车),问你冲过终点的最短时间。

思路:这道题我们不应该把重点放在每一辆车何时冲过终点,不然这题会变得非常复杂,而是应该考虑冲过终点后它何时能留出足够的空间让后面的车放下,这才是我们真正应该求的临界状态,比如第一辆车长度是3,后面一辆长度是2,则第一辆车至少要车头冲过终点线并且再走5的长度才能让后面一辆车放下(它自己的车身3+后面那辆车的长度2),说的明白点,就是至少要再跑除了我们自己那辆车之外的所有车的长度(因为我们自己的车只要冲过终点就行了,所以前面的车不需要给我们的车留空间),这样就能让后面的车全部都跑出来,这样我们的车才能冲过终点。要是冲过那个临界位置我们就不用管了呀,所以我们只要考虑临界位置就好了。那么问题又来了,要是后面的车被前面的车堵住了怎么办?我们可以先思考一下,什么情况下后面一辆车会被前面一辆车给堵住?当然是后面一辆车到达它自己应该到的那个位置时,前面一辆车却没有到达前面一辆车它自己应该到达的位置(也就是各自的临界位置),这样他们肯定在行驶过程中相碰了。所以真正用的时间就是最慢到达自己临界位置的那辆车所用的时间(因为后面的车全部被这辆“拖拉机”堵住了),如此类推下去,我们需要的时间就是每一辆车达到它应该到达的位置的时间的最大值,此题结束。

代码:

 1 #include "stdio.h"
 2 #include "algorithm"
 3 using namespace std;
 4 const int N=1e5+7;
 5 int n,l[N],s[N],v[N],sum[N];
 6 double t,t1;
 7
 8 int main() {
 9     while(~scanf("%d", &n))
10     {
11         t=-1;             ///初始化一下答案
12         for (int i = 1; i <= n + 1; i++)
13             scanf("%d", &l[i]);
14         for (int i = 1; i <= n + 1; i++)
15             scanf("%d", &s[i]);
16         for (int i = 1; i <= n + 1; i++)
17             scanf("%d", &v[i]);
18         for(int i=2;i<=n+1;i++)
19             sum[i]=sum[i-1]+l[i];     ///先把车身长度也就是每辆车需要预留的位置给预处理出来
20         for(int i=n+1;i>=1;i--)
21         {
22             t1=(s[i]+sum[i])*1.0/v[i];    ///这辆车到达它应该到达的位置的位置所用的时间
23             t=max(t,t1);       ///找出那辆最慢的“拖拉机”,当i=1时,t代表我们没有被挡直接冲过终点所用的时间
24         }
25         printf("%.10f\n",t);
26     }
27     return 0;
28 }

谢谢访问,如果觉得好的话可以点个赞哦,有不懂的也可以在下面提问,互相学习,共同进步,谢谢大家的支持!

原文地址:https://www.cnblogs.com/Satan666/p/11273615.html

时间: 2024-10-05 21:51:52

hdu 6581 Vacation【思维】的相关文章

HDU 6581 Vacation

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 910    Accepted Submission(s): 349Special Judge Problem Description Tom and Jerry are going on a vacation. They are now driving on a one-way ro

hdu 4550 贪心 思维题 不错

http://acm.hdu.edu.cn/showproblem.php?pid=4550 想了挺久,然后各种分类 终于AC,如果是现场,对自己没信心的话,估计还是要WA,,,,,,然后搜题解,发现人家都认为是简单题,看来我还是太弱了,牡丹江没有做出来K看来还是自己贪心和思维有问题 d是一个Deque 最朴素的算法是,如果当前的数<=d.front(),那么插入队列的前面,否则插入队列后面,但是有零所以需要单独处理,还是自己多举例找规律 我的策略: 1.记录0的个数zero,最小非零的数的个数

HDU 5776 sum (思维题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5776 题目让你求是否有区间的和是m的倍数. 预处理前缀和,一旦有两个数模m的值相同,说明中间一部分连续子列可以组成m的倍数. 1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algorithm> 3 #include <iostream> 4 #include <cs

hdu 4803 贪心/思维题

http://acm.hdu.edu.cn/showproblem.php?pid=4803 话说C++还卡精度么?  G++  AC  C++ WA 我自己的贪心策略错了 -- 就是尽量下键,然后上键,最后下键补全,可是例子都过不了..... 题解參考http://www.cnblogs.com/xuesu/p/3967704.html http://www.cnblogs.com/Canon-CSU/p/3451784.html http://blog.csdn.net/keshuai199

HDU 6098 Inversion 思维

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6098 题目描述: 给出一个序列, 让你求序列中所有不能整除i的最大值并输出  i  属于 2 ~ n 解题思路: 这道题我犯蠢了......我想的是找规律, 所有质数先求出来再单独抠倍数, 其实只要排序就好了..... 代码: #include <iostream> #include <cstdio> #include <string> #include <vect

hdu 4474 BFS+思维题

http://acm.hdu.edu.cn/showproblem.php?pid=4474 如果A%n ==B %n  (A<B) 那么A接下来A经若干次填位数使得A'%n==0,这个过程也可以使B'%n==0  但是显然A更小,所以开一个1e4的数组判重 犯得二逼错误: 1.需要记录每一位,不是mod%10就是每一位 2.第一位枚举1~9,但是仍然需要%n 3.必然需要高精度,开始ll  WA到死 #include <cstdio> #include <cstring>

HDU - 5765 Bonds 思维 + sosdp(子集和dp)

HDU - 5765 一个bond肯定把n个点分成两个连通块, 并且每个集合对应一个bond, 因为当前这个集合属于第一个连通块, 那么它的补集就输入另一个连通块, ok[ mask ] 表示 mask这些点集能否成为一个连通块. 我们称一个分配方案mask是好的当且仅当ok[ mask ] == true && ok[ ~mask ] = true; 那么我们考虑一条边(u, v)属于多少个bond, 也就是总的合法的分配方案  减去 u, v在同一个点集里的方案数. 我们考虑sosdp

HDU - 5770 Treasure 思维 + 扫描线 + 线段树 (看题解)

HDU - 5770 没想出来, 感觉不应该啊, 没有想到转换成二维上的点的问题. 对于对钥匙和宝藏(u, v), 如果lca != u && lca != v 那么起点从u子树出发, 终点在v子树就能得到贡献. 子树在dfs序下是连续一段, 所以就对应到二维平面一个矩形加上一个数值, 求值最大的点. 对于lca == u || lca == v同样可以讨论出来. 还有一种情况就是u == v, 我们先把贡献都加上, 然后对于不经过u 的所有路径进去这个贡献. 然后扫描线扫一遍就好了. #

HDU 5229 博弈思维

题意:总共有N 个串, 从中拿出2个串来,两人轮流进行两种操作 操作1:   将两个串中随机拿出一个非空串,删掉其末尾字母 操作2:   如果两个串相同且非空才能执行该操作,清空两个串: 谁面临无法执行操作时 ,  判为输,  两人足够机灵 题解:明显  如果两个串相同则必定先生赢,两个人为了避免对手拿到必胜状态一定会尽量使两个串差距大.策略为拿两个串中最小的串,既能使对家面临两个串都为空的状态或者是两个串不相等的非必胜状态.两人同时采取最优策略,  那么很明显最终的输赢只和取的A和B 串长有关