https://vjudge.net/problem/POJ-1064
当然我是在Virtual Judge上面写的,可以直接去POJ去提交。
这个题目感觉并不是很困难的样子,主要就是一个二分的思想,之前写的时候,主要是结尾判断的时候,没有向下取整,直接四舍五入的,导致一直提交失败,甚至写了不只一个版本的代码。
下面,我随便给出两个版本的结果,都能过。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int N, K;
const int MAX_N = 10000;
double L[MAX_N];
bool binary_search_L(double mid_L)
{
int total = 0;
for (int i = 0 ; i < N; ++i)
{
total += int(L[i] / mid_L);
}
return total >= K;
}
void solve()
{
double min_L = 0;
double max_L = 10000000;
for (int i = 0; i < 200; ++i)
{
double mid_L = (min_L + max_L) / 2;
if (binary_search_L(mid_L))
{
min_L = mid_L;
}
else
{
max_L = mid_L;
}
}
cout.setf(ios_base::fixed);
cout.precision(2);
cout << floor(min_L *100) / 100 << endl;
//printf("%.2f",min_L);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N;
cin >> K;
for (int i = 0; i < N; ++i)
{
cin >> L[i];
}
solve();
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <iomanip>
#include <cmath>
using namespace std;
const int N = 10000+10;
const int K = 10000+10;
int n,k;
double a[N];
bool greed(double mid)
{
int cnt=0;
for(int i=0;i<n;++i)
{
cnt+=int(a[i]/mid);
}
if(cnt>=k)
return true;
else{
return false;
}
}
double Find()
{
double l=0,r=100010;
while(r-l>1e-5)
{
double mid=(r+l)/2;
if(greed(mid))
{
l=mid;
}
else
{
r=mid;
}
}
return r;
}
int main()
{
double Max=-1;
cin>>n>>k;
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
if(a[i]>Max){
Max=a[i];
}
}
sort(a,a+n);
printf("%.2f\n",floor(Find()*100)/100);
//cout<<setiosflags(ios::fixed)<<setprecision(2);
//cout<<Find(Max)<<endl;
return 0;
}