网线主管 (二分)
【题目链接】
http://noi.openjudge.cn/ch0111/04/
【算法】
显然是二分的,但是这个精度有毒。精确到小数点后两位,例如若用double存4则为3.9999,所以将所给数乘以100向上取整后存在int数组里,然后二分即可。
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,k,l=0,r=1e7; 4 double tmp; 5 int a[10010]; 6 int main() 7 { 8 scanf("%d%d",&n,&k); 9 for(int i=1;i<=n;i++) scanf("%lf",&tmp),a[i]=ceil(tmp*100); 10 while(l<r) { 11 int mid=(l+r+1)/2; 12 int rec=0; 13 for(int i=1;i<=n;i++) rec+=a[i]/mid; 14 if(rec>=k) l=mid; 15 else r=mid-1; 16 } 17 printf("%.2lf",l/100.00); 18 return 0; 19 }