double真是烦呐(q'w'q
40分代码
#include <bits/stdc++.h>
using namespace std;
typedef double dint;
const int N = 1e5+5;
/*
1)在验证一个使用时间时,若设备已有的能量大于使用时间需要的能量,忽略该设备。
2)否则用充电器充电,使设备已有的能量等于使用时间需要的能量,并记录需要的能量。
3)最后比较需要的能量总和和充电器最多提供的能量。
*/
int n,p,wind_kaka;
dint a[N],b[N],ES;
//二分使用时间(use time)
bool check(dint ut){
//剩余时间(residue time)
dint rt = ut;
for(int i = 1; i <= n; i++){
if(b[i] >= a[i]*ut)
continue;
rt += b[i]-a[i]*ut;
}
return rt >= 0;
}
int main() {
scanf("%d %d",&n,&p);
for(int i = 1; i <= n; i++){
scanf("%lf %lf",&a[i],&b[i]);
wind_kaka += a[i];
}
if(wind_kaka <= p){
printf("-1\n");
return 0;
}
dint l = 0,r = (dint)100000000;
while(l+0.000001 < r){
dint mid = (l + r) / 2.0;
if(check(mid)){
ES = mid;
l = mid;
}else r = mid;
}
printf("%lf\n",ES);
return 0;
}
改完以后变30了
#include <bits/stdc++.h>
using namespace std;
typedef double dint;
const int N = 1e5+5;
/*
1)在验证一个使用时间时,若设备已有的能量大于使用时间需要的能量,忽略该设备。
2)否则用充电器充电,使设备已有的能量等于使用时间需要的能量,并记录需要的能量。
3)最后比较需要的能量总和和充电器最多提供的能量。
*/
int n,p,wind_kaka;
dint a[N],b[N],ES;
//二分使用时间(use time)
bool check(dint ut){
//剩余时间(residue time)
dint rt = ut;
for(int i = 1; i <= n; i++){
if(b[i] >= a[i]*ut)
continue;
rt += (dint)((long long)b[i]-(long long)(a[i]*ut));
}
return rt >= 0;
}
int main() {
scanf("%d %d",&n,&p);
for(int i = 1; i <= n; i++){
scanf("%lf %lf",&a[i],&b[i]);
wind_kaka += a[i];
}
if(wind_kaka <= p){
printf("-1\n");
return 0;
}
dint l = 0,r = (dint)1e9;
while(l+0.000001 < r){
dint mid = (l + r) / 2.0;
if(check(mid)){
ES = mid;
l = mid;
}else r = mid;
}
printf("%lf\n",ES);
return 0;
}