#include #include #include #include bool canEat(const std::vector &q, const std::vector &f, double amt) { int n = q.size(); struct Food { double value; int expiry; bool operator<(const Food &other) const { return expiry > other.expiry; } }; std::priority_queue pq; for(int i=0; i 0) { if(pq.empty()) return false; auto next = pq.top(); pq.pop(); if(needed >= next.value) needed -= next.value; else { next.value -= needed; needed = 0; pq.push(next); } } } return true; } int main() { int n, k; std::cin >> n >> k; std::vector q(n); std::vector f(n); for(int i=0; i> q[i] >> f[i]; f[i]--; } double lo = 1e-10; double hi = 1.0; if(!canEat(q, f, lo)) { std::cout << -1 << std::endl; } else { while(canEat(q, f, hi)) hi *= 2.0; while(hi - lo > 1e-10 && (hi - lo)/lo > 1e-10) { double mid = lo + (hi-lo)/2.0; if(canEat(q, f, mid)) { lo = mid; } else { hi = mid; } } std::cout << std::setprecision(30) << lo/double(k) << std::endl; } }