这段代码得85分,具体原因我也不知(主要懒得测了)
```c
#include<stdio.h>
n,p,a[100000],b[100000];
_Bool chk(long double t){
long double mx=p*t,sum=0,tmp;
for(int i=0;i<n;++i){
if((tmp=a[i]*t-b[i])>0)
sum+=tmp;
}
return sum<=mx;
}
main(){
scanf("%d%d",&n,&p);
int sum=0;
for(int i=0;i<n;++i)
scanf("%d%d",a+i,b+i),sum+=a[i];
if(sum<=p)return puts("-1"),0;
long double L=0,R=1e10,M,e=1e-11;
do{
chk(M=(L+R)/2)?L=M:(R=M-e);
}while(R-L>e);
printf("%Lf",L);
}
```
以下代码是AC代码
```c
n,p,a[100000],b[100000];
_Bool chk(double t){
double mx=p*t,sum=0,tmp;
for(int i=0;i<n;++i){
if((tmp=a[i]*t-b[i])>0)
sum+=tmp;
}
return sum<=mx;
}
main(){
scanf("%d%d",&n,&p);
for(int i=0;i<n;++i)
scanf("%d%d",a+i,b+i);
double L=0,R=1e10,M,e=1e-6;
do{
chk(M=(L+R)/2)?L=M:(R=M-e);
}while(R-L>e);
if(R!=1e10)printf("%lf",M);
else puts("-1");
}
```
已知的几点:```R```必须到```1e10```
,精度必须是```1e-6```,然后我刚开始和你思路一样,用```sum```来统计```a[i]```的和,可不知为何这样会丢分,所以最后根据R是否不变来输出```-1```
by cat_lover1 @ 2023-11-14 23:30:03
初始值,```l```得是0
by cat_lover1 @ 2023-11-14 23:39:44
```
#include<stdio.h>
int n, p;
int a[100005], b[100005];
_Bool check(double x){//判断是否是答案
double q = p * x, sum = 0,tmp;
for(int i = 0; i < n; i++){
if((tmp=a[i] * x-b[i]) > 0)sum += tmp;
}
return sum <= q;
}
int main(){
scanf("%d%d", &n, &p);
long long sum=0;
for(int i = 0; i < n; i++) {
scanf("%d%d", a+i, b+i);
sum += a[i];
}
if(sum <= p){
printf("-1");
return 0;
}
double l = 0, r = 1e10,e=1e-6,mid;
while(r - l >e)
{
if(check(mid = (l+r) / 2))
l = mid;
else r = mid-e;
}
printf("%lf", l);
return 0;
}
```
by cat_lover1 @ 2023-11-14 23:40:23