Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously.

The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power stored. All devices can store an arbitrary amount of power.

You have a single charger that can plug to any single device. The charger will add p units of power per second to a device. This charging is continuous. That is, if you plug in a device for λ seconds, it will gain λ·p units of power. You can switch which device is charging at any arbitrary unit of time (including real numbers), and the time it takes to switch is negligible.

You are wondering, what is the maximum amount of time you can use the devices until one of them hits 0 units of power.

If you can use the devices indefinitely, print -1. Otherwise, print the maximum amount of time before any one device hits 0 power.

Input

The first line contains two integers, n and p (1 ≤ n ≤ 100 000, 1 ≤ p ≤ 109) — the number of devices and the power of the charger.

This is followed by n lines which contain two integers each. Line i contains the integers ai and bi (1 ≤ ai, bi ≤ 100 000) — the power of the device and the amount of power stored in the device in the beginning.

Output

If you can use the devices indefinitely, print -1. Otherwise, print the maximum amount of time before any one device hits 0 power.

Your answer will be considered correct if its absolute or relative error does not exceed 10 - 4.

Namely, let‘s assume that your answer is a and the answer of the jury is b. The checker program will consider your answer correct if .

Examples

Input

2 1 2 2 2 1000

Output

2.0000000000

Input

1 100 1 1

Output

-1

Input

3 5 4 3 5 2 6 1

Output

0.5000000000

Note

In sample test 1, you can charge the first device for the entire time until it hits zero power. The second device has enough power to last this time without being charged.

In sample test 2, you can use the device indefinitely.

In sample test 3, we can charge the third device for 2 / 5 of a second, then switch to charge the second device for a 1 / 10 of a second



  二分答案,然后判断所有需要充电的需要充的电是否大于等于充电总量。

  注意初值和控制一下二分的次数。

Code

  1 /**
  2  * Codeforces
  3  * Problem#772A
  4  * Accepted
  5  * Time:61ms
  6  * Memory:2836k
  7  */
  8 #include <iostream>
  9 #include <cstdio>
 10 #include <ctime>
 11 #include <cmath>
 12 #include <cctype>
 13 #include <cstring>
 14 #include <cstdlib>
 15 #include <fstream>
 16 #include <sstream>
 17 #include <algorithm>
 18 #include <map>
 19 #include <set>
 20 #include <stack>
 21 #include <queue>
 22 #include <vector>
 23 #include <stack>
 24 #ifndef WIN32
 25 #define Auto "%lld"
 26 #else
 27 #define Auto "%I64d"
 28 #endif
 29 using namespace std;
 30 typedef bool boolean;
 31 const signed int inf = (signed)((1u << 31) - 1);
 32 const double eps = 1e-6;
 33 const int binary_limit = 128;
 34 #define smin(a, b) a = min(a, b)
 35 #define smax(a, b) a = max(a, b)
 36 #define max3(a, b, c) max(a, max(b, c))
 37 #define min3(a, b, c) min(a, min(b, c))
 38 template<typename T>
 39 inline boolean readInteger(T& u){
 40     char x;
 41     int aFlag = 1;
 42     while(!isdigit((x = getchar())) && x != ‘-‘ && x != -1);
 43     if(x == -1) {
 44         ungetc(x, stdin);
 45         return false;
 46     }
 47     if(x == ‘-‘){
 48         x = getchar();
 49         aFlag = -1;
 50     }
 51     for(u = x - ‘0‘; isdigit((x = getchar())); u = (u << 1) + (u << 3) + x - ‘0‘);
 52     ungetc(x, stdin);
 53     u *= aFlag;
 54     return true;
 55 }
 56
 57 inline int dcmp(double a, double b) {
 58     if(fabs(a - b) < eps)    return 0;
 59     if(a - b < 0)    return -1;
 60     return 1;
 61 }
 62
 63 int n, p;
 64 int *a, *b;
 65 long long s = 0;
 66
 67 inline void init() {
 68     readInteger(n);
 69     readInteger(p);
 70     a = new int[n + 1];
 71     b = new int[n + 1];
 72     for(int i = 1; i <= n; i++) {
 73         readInteger(a[i]);
 74         readInteger(b[i]);
 75         s += a[i];
 76     }
 77 }
 78
 79 boolean check(double mid) {
 80     double cost = 0.0;
 81     for(int i = 1; i <= n; i++)
 82         if(a[i] * mid >= b[i])
 83             cost += a[i] * mid - b[i];
 84     return cost < p * mid;
 85 }
 86
 87 inline void solve() {
 88     if(s <= p) {
 89         puts("-1");
 90         return;
 91     }
 92     double l = 0, r = 1e16;
 93     int times = 0;
 94     while(dcmp(l, r) == -1 && times < binary_limit) {
 95         double mid = (l + r) / 2;
 96         times++;
 97         if(check(mid))    l = mid;
 98         else r = mid;
 99     }
100     printf("%.6lf", l);
101 }
102
103 int main() {
104     init();
105     solve();
106     return 0;
107 }
时间: 2024-10-14 20:41:16

Codeforces 772A Voltage Keepsake - 二分答案的相关文章

Codeforces Round #425 (Div. 2) Problem C (Codeforces 832C) Strange Radiation - 二分答案 - 数论

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-n

Educational Codeforces Round 21 Problem F (Codeforces 808F) - 最小割 - 二分答案

Digital collectible card games have become very popular recently. So Vova decided to try one of these. Vova has n cards in his collection. Each of these cards is characterised by its power pi, magic number ci and level li. Vova wants to build a deck

codeforces #8D Two Friends 二分答案+计算几何

题目大意:给定平面上的三个点A,B,C,Alan需要从A走到C再走到B,Bob需要从A直接走到B,要求Alan走过的长度不能超过最短路长度+t1,Bob走过的长度不能超过最短路长度+t2,求两人在一起最多走多久(分开后再汇合不算一起走) 设Alan最多走L1,Bob最多走L2 首先如果Bob能陪伴Alan全程(即L2≥Distance(A,C)+Distance(C,B)),那么答案显然为min(L1,L2) 否则两人分离时Bob一定还没有经过C点 容易发现答案是单调的,我们不妨二分答案 不妨设

codeforces CF85E Guard Towers 二分答案 二分图判定

$ \rightarrow $ 戳我进CF原题 E. Guard Towers time limit per test: 1.5 seconds memory limit per test: 256 megabytes input: standard input outputstandard output In a far away kingdom lives a very greedy king. To defend his land, he built $ n $ guard towers.

CodeForce-801C Voltage Keepsake(二分)

题目大意:有n个装备,每个设备耗能为每单位时间耗能ai,初始能量为bi;你有一个充电宝,每单位时间可以冲p能量,你可以在任意时间任意拔冲. 如果可以所有设备都可以一直工作下去,输出-1:否则,输出所有设备都同时工作的最长时间. 思路提示:想象这样一个场景,每当一个设备没电时,你就拔掉你正在充电的设备,冲到这个设备上.可是,天有不测风云,突然某一刻,有2个以上设备同时没电,那至少有一个设备得停止工作.这一刻也就是答案,让我们来看一看这一刻的状况,设这一刻为t,充电宝总共供能t*p,这时t*p==s

Codeforces 801C Voltage Keepsake 结构体sort排序+贪心

#include <bits/stdc++.h> using namespace std; struct In{ long long a, b; double t; }s[100005]; bool cmp(In p, In q) { if(p.t < q.t) return true; else if(p.t == q.t && p.a < q.a) return true; return false; } int main() { long long n, p;

Codeforces 700A As Fast As Possible(二分答案)

[题目链接] http://codeforces.com/problemset/problem/700/A [题目大意] 有一辆限载k人速度为v2的车,n个步行速度均为v1的人要通过一段长度为l的距离,每个人只能上车一次,车可以来回走,问所有人到达目的地所需要的最短时间是多少 [题解] 因为车可以载k个人,所以,我们把人k个为一组分成(n+k-1)/k组,记为p吗,设需要的最短时间为t,每个人在车上待的时间为t2,那么可以列方程v1*(t-t2)+v2*t2=l,我们可以发现t2可以用t来表示,

Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market 二分答案 +排序

Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market 二分答案 +排序 题意 有 a[ i ] 个数 要求选最多的数 使其和不超过 S ,且在此情况下,和最小选最多数情况下 和最小 且 每个数有加成 如果选了 k个数 那么加成后 就是 a[ i ] + k*i ; 题解 二分mid 表示选了个数 加成一下,将加成以后结果排序一下 , 若前 mid数 和大于 s 则此方案不可行 PS 要用 long long ..... 还有 co

Codeforces 460C prsent(二分答案)

//题意:给定N朵花的原先的高度,从左到右排列, //最多浇水m天,每天只能浇一次,每次使得连续的w朵花的高度增长1,问最后最矮的花的高度最高是多少. # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int main() { __int64 n,m,w,l,r,i,m1,sum; __int64 a[200010],b[200010]; while(~