题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=1604
本题继续练习二分。
这题太恶心了,精度卡的,足够把人烦死,WA了N次。
注意一个重要的地方就行了使用%.nlf的时候,其实是会四舍五入的。这时倒不如手工来算。
注意标注的两个要点:
上代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
long long array[10003];
int s = 10000;
int n,k;
bool cmp(long long a,long long b)
{
return a>b;
}
int calc(long long m)
{
int p = 0;
for(int i=0;i<n;i++)
{
p += array[i]/m;
}
return p>=k;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int l,r;
int ans;
double a;
while(scanf("%d %d",&n,&k) == 2)
{
ans = 0;
for(int i=0;i<n;i++)
{
scanf("%lf",&a);
array[i] = (a+1e-8) * s;//要点一
}
sort(array,array+n,cmp);
l = s/100;
r = array[0];
while(l<=r)
{
long long m = (l + r)/2;
if(calc(m)>0)
{
l = m+1;
ans = m;
}
else
{
r = m-1;
}
}
//要点二
int th = ans/10000;
int hu = (ans - th * 10000)/1000;
int te = (ans - th * 10000 - hu * 1000)/100;
printf("%d.%d%d\n",th,hu,te);
}
return 0;
}