首页 > 代码库 > CodeForces 801C 二分,浮点数
CodeForces 801C 二分,浮点数
CodeForces 801C
题意: n个设备,第 i个设备每秒用电a[i],原本储存电量b[i]。只有一个充电器,每秒可给一个设备充电 p。所有的设备要同时工作,问最多可以工作多长时间?
tags:就是二分,但写挂了好多发。。
坑点:
1、右边界会爆1e9 。。。
2、担心 double 会丢失精度,用了 long double。
然后long double ,头文件 #include <iomanip.h> 。一开始用 printf("%.6Lf\n", r)输出,在自己电脑上输出好好的,交上去就莫名其妙的错了。然后改用 cout<<fixed<<setprecision(6)<<r<<endl 过了, 23333
#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#include<string>#include<cmath>#include<queue>#include<stack>#include<map>#include<bitset>#include<vector>#include<set>#include<list>#include<iomanip>using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define rep(i,a,b) for (int i=a;i<=b;i++)#define per(i,b,a) for (int i=b;i>=a;i--)#define mes(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define MP make_pair#define PB push_back#define fi first#define se secondtypedef long long ll;const int N = 200005;ll n, p, a[N], b[N];int main(){ scanf("%lld %lld", &n, &p); rep(i,1,n) { scanf("%lld %lld", &a[i], &b[i]); } long double l=0, r=1e10, mid; while(r-l>0.000001) { mid=(l+r)/2; long double ans1=0; rep(i,1,n) { ans1 += max(a[i]*mid-b[i], (long double)0); } if(ans1<=mid*p) l=mid; else r=mid; } if(1e10-r>0.000001) cout<<fixed<<setprecision(6)<<r<<endl; else puts("-1"); return 0;}
CodeForces 801C 二分,浮点数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。