程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> CF24E 二分(應注意二分什麼和二分時的處理細節)

CF24E 二分(應注意二分什麼和二分時的處理細節)

編輯:關於C++

 

 

E. Berland collider time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output

Recently the construction of Berland collider has been completed. Collider can be represented as a long narrow tunnel that contains nparticles. We associate with collider 1-dimensional coordinate system, going from left to right. For each particle we know its coordinate and velocity at the moment of start of the collider. The velocities of the particles don't change after the launch of the collider. Berland scientists think that the big bang will happen at the first collision of particles, whose velocities differs in directions. Help them to determine how much time elapses after the launch of the collider before the big bang happens.

Input

The first line contains single integer n (1 ≤ n ≤ 5·105) — amount of particles in the collider. Next n lines contain description of particles. Each particle is described by two integers xi, vi ( - 109 ≤ xi, vi ≤ 109, vi ≠ 0) — coordinate and velocity respectively. All the coordinates are distinct. The particles are listed in order of increasing of coordinates. All the coordinates are in meters, and all the velocities — in meters per second. The negative velocity means that after the start of collider the particle will move to the left, and the positive — that the particle will move to the right.

Output

If there will be no big bang, output -1. Otherwise output one number — how much time in seconds elapses after the launch of the collider before the big bang happens. Your answer must have a relative or absolute error less than 10 - 9.

Sample test(s) input
3
-5 9
0 1
5 -1
output
1.00000000000000000000
input
6
1 3
2 3
3 3
4 -3
5 -1
6 -100
output
0.02912621359223301065
/**
CF24E 二分
題目大意:在x軸上有n個點每個點向左或向右發射子彈,知道每個點的坐標和所發射子彈的飛行速度,問所有相向而行的的子彈中最短的相遇時間
解題思路:不能枚舉兩方向的點,我們要采取二分時間的方式,由於精度太小可能陷入無限循環,我們限制一下二分的次數
*/
#include 
#include 
#include 
#include 
using namespace std;
const int maxn=500005;
int n,a[maxn][2];

bool judge(double t)
{
    double d=-1e20;
    for(int i=0;i0)
            d=max(d,a[i][0]+t*a[i][1]);
         else if(a[i][0]+t*a[i][1]<=d)return true;
    }
    return false;
}
int main()
{
    while(~scanf(%d,&n))
    {
        for(int i=0;i

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved