40pt?

P3743 小鸟的设备

这段代码得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


|