发布题解便于我日后复习二分用 顺便水下咕值
看到这道题,根据题意我们能很快找到c与时间t和d[i],s[i]的关系,然后呢?
然后不会了 于是就想到了二分答案 二分枚举,一直靠近答案为止 代码有注释
#include<iostream> #include<cstdio> #include<cstring> using namespace std; double d[100000],s[100000]; int n,t; bool check(double x){ double sum=0; for(register int i=1;i<=n;i++){ double m=s[i]+x;//算出枚举出来的速度 if(m<=0)return 0;//速度总不可能小于0吧 sum+=d[i]/m;//累加时间 } if(sum<=t)return 1;//如果时间小于总时间,可行 else return 0; } int main(){ int i,j; while(~scanf("%d%d",&n,&t)){double ans; double l=-20000000,r=20000000;//枚举左右区间 for(i=1;i<=n;i++) scanf("%lf%lf",&d[i],&s[i]); for(i=1;i<=100;i++) { double mid=(l+r)/2; if(check(mid)){ ans=mid; r=mid;//如果答案可行,储存 } else l=mid; } printf("%.9lf\n",ans); } return 0; }