蒟蒻在调试n次后选择来寻找大神! 95分TLE,详细看链接
源码:
#include<bits/stdc++.h>
using namespace std;
int n,m; //足够了,不要浪费空间
int a[100100],b[100100]; //还是老样子,多开100个空间
bool check(double);
int main(){
long long sum=0;
scanf("%d%d",&n,&m); //省点时间
for(int i=0;i<n;i++){
scanf("%d%d",&a[i],&b[i]);
sum+=b[i];
}
if(sum<=m){
cout<<-1;
return 0;
}
double mid,left=0,right=1e10,cnt;
//二分答案的模板,谁不做笔记?统统吃掉!
while(right-left>=1e-11){ //精度,精度!
mid=(right+left)/2;
if(check(mid)){
cnt=mid;//中心思想
left=mid+1e-11;//主要原因是保留十位小数
}else{
right=mid-1e-11;//精度到1e-11就差不多了,再小就丢精度了(时间也有可能爆)
}
}
printf("%.10lf",cnt);
}
bool check(double mid){
double cnt=0;
for(int i=0;i<n;i++){
double now;
now=a[i]*mid; //如果这个结果小于等于b[i],也就是说这段时间内他不会没电,就不冲
if(now>b[i]){
cnt+=now-b[i]; //充多少?
}
}
return cnt<=m*mid;
}