POJ 1064 Cable master
二分+验证。
这个题目精度卡的很紧。做的时候最好每个数先×100再做。
最精确的方法是字符串读入,然后转成long long。
输出的时候再把long long转回小数。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; const int maxn=10000+10; int n; long long k; long long a[maxn]; char s[10]; bool check(long long len) { long long cnt=0; for(int i=1;i<=n;i++) { cnt=cnt+a[i]/len; if(cnt>=k) return 1; } return 0; } int main() { while(~scanf("%d%lld",&n,&k)) { long long l=1,r=0,ans=0; for(int i=1;i<=n;i++) { scanf("%s",s); a[i]=0; for(int j=0;s[j];j++) { if(s[j]=='.') continue; a[i]=a[i]*10+(long long)(s[j]-'0'); } r=max(r,a[i]); } while(l<=r) { long long mid=(l+r)/2; if(check(mid)) ans=mid,l=mid+1; else r=mid-1; } printf("%lld.%02lld\n",ans/100,ans%100); } return 0; }