题意: n个设备,第 i个设备每秒用电a[i],原本储存电量b[i]。只有一个充电器,每秒可给一个设备充电 p。所有的设备要同时工作,问最多可以工作多长时间?
tags:就是二分,但写挂了好多发。。
坑点:
1、右边界会爆1e9 。。。
2、担心 double 会丢失精度,用了 long double。
然后long double ,头文件 #include <iomanip.h> 。一开始用 printf("%.6Lf
", 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 second typedef 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; }