博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #425 (Div. 2)C
阅读量:5160 次
发布时间:2019-06-13

本文共 4677 字,大约阅读时间需要 15 分钟。

题目连接:http://codeforces.com/contest/832/problem/C

C. Strange Radiation
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

n people are standing on a coordinate axis in points with positive integer coordinates strictly less than 106. For each person we know in which direction (left or right) he is facing, and his maximum speed.

You can put a bomb in some point with non-negative integer coordinate, and blow it up. At this moment all people will start running with their maximum speed in the direction they are facing. Also, two strange rays will start propagating from the bomb with speed s: one to the right, and one to the left. Of course, the speed s is strictly greater than people's maximum speed.

The rays are strange because if at any moment the position and the direction of movement of some ray and some person coincide, then the speed of the person immediately increases by the speed of the ray.

You need to place the bomb is such a point that the minimum time moment in which there is a person that has run through point 0, and there is a person that has run through point 106, is as small as possible. In other words, find the minimum time moment t such that there is a point you can place the bomb to so that at time moment t some person has run through 0, and some person has run through point106.

Input

The first line contains two integers n and s (2 ≤ n ≤ 105, 2 ≤ s ≤ 106) — the number of people and the rays' speed.

The next n lines contain the description of people. The i-th of these lines contains three integers xivi and ti (0 < xi < 106, 1 ≤ vi < s,1 ≤ ti ≤ 2) — the coordinate of the i-th person on the line, his maximum speed and the direction he will run to (1 is to the left, i.e. in the direction of coordinate decrease, 2 is to the right, i.e. in the direction of coordinate increase), respectively.

It is guaranteed that the points 0 and 106 will be reached independently of the bomb's position.

Output

Print the minimum time needed for both points 0 and 106 to be reached.

Your answer is considered correct if its absolute or relative error doesn't exceed 10 - 6. Namely, if your answer is a, and the jury's answer is b, then your answer is accepted, if .

Examples
input
2 999 400000 1 2 500000 1 1
output
500000.000000000000000000000000000000
input
2 1000 400000 500 1 600000 500 2
output
400.000000000000000000000000000000
Note

In the first example, it is optimal to place the bomb at a point with a coordinate of 400000. Then at time 0, the speed of the first person becomes 1000 and he reaches the point 106 at the time 600. The bomb will not affect on the second person, and he will reach the 0point at the time 500000.

In the second example, it is optimal to place the bomb at the point 500000. The rays will catch up with both people at the time 200. At this time moment, the first is at the point with a coordinate of 300000, and the second is at the point with a coordinate of 700000. Their speed will become 1500 and at the time 400 they will simultaneously run through points 0 and 106.

 

题意:改出N个人的初始始方向和速度,然后让你放一颗炸弹在某个整数位置,炸弹会在最开始爆炸,并且造成往左往右的两个光束,当光束追上人(有相同的方向)的时候人会加上光的速度,问你把炸弹放在某一个位置使得在往左往右都跑出至少一人的时间?

题解:二分时间,每次判断能否在规定时间能否左右都跑出至少一人,

#include
#include
using namespace std ;typedef long long ll;const int maxn=1e5+5; int s,n; struct node{ int p,v,f; }a[maxn]; bool judge(double lim){ bool left=false,right=false; double left_l=1e6,left_r=0,right_l=1e6,right_r=0; for(int i=0;i
0)continue; left=true; if(a[i].p-a[i].v*lim<=0.0) { left_l=0;left_r=1e6; continue; } double rr=floor((s-a[i].v)*(((a[i].v+s)*lim-a[i].p)/(double)s)+a[i].p);//解三元一次方程就可以得到最大位置 left_r=max(left_r,rr); left_l=min(left_l,(double)a[i].p); } else { if(a[i].p+(s+a[i].v)*lim<1e6)continue; right=true; if(a[i].p+a[i].v*lim>=1e6) { right_l=0,right_r=1e6; continue; } double LL=ceil(a[i].p+(a[i].v-s)*(1e6-a[i].p-(a[i].v+s)*lim)/(-s));//同上 right_l=min(right_l,LL); right_r=max(right_r,(double)a[i].p); } } if(!left||!right)return false; if((left_l>left_r)||(right_l>right_r)) return false; if(right_r
left_r)return false; else return true; } int main(){ scanf("%d %d",&n,&s); for(int i=0;i

 

 

转载于:https://www.cnblogs.com/lhclqslove/p/7422966.html

你可能感兴趣的文章
SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
查看>>
内部元素一一相应的集合的算法优化,从list到hashmap
查看>>
游戏中的心理学(一):认知失调有前提条件
查看>>
SpringMVC-处理AJAX
查看>>
WHAT I READ FOR DEEP-LEARNING
查看>>
【Ruby】Ruby在Windows上的安装
查看>>
Objective C 总结(十一):KVC
查看>>
BZOJ 3747 洛谷 3582 [POI2015]Kinoman
查看>>
vue实战(7):完整开发登录页面(一)
查看>>
[转载]mysql的left,right,substr,instr截取字符串,截取
查看>>
Visual Studio自定义模板(二)
查看>>
【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
查看>>
摘抄详细的VUE生命周期
查看>>
javascript高级程序设计---js事件思维导图
查看>>
sprint计划会议
查看>>
读《构建之法-软件工程》第四章有感
查看>>
使用 Printf via SWO/SWV 输出调试信息
查看>>
.net 分布式架构之分布式锁实现(转)
查看>>
吴恩达机器学习笔记 —— 3 线性回归回顾
查看>>
在SpringMVC中自定义上下文的一些想法
查看>>