标签:blog io os for div sp 代码 log on
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const int maxn=10000;
const double eps=0.00001;
double Len[maxn];
int n,k;
double Max;
bool Right(double len)
{
int ans(0);
for (int i=0;i<n;i++)
{
ans+=(int)(Len[i]/len);
}
if (ans>=k)
return true;
else
return false;
}
bool Bigger(double a,double b)
{
if (a-b<=eps)
return true;
else
return false;
}
void Init()
{
cin>>n>>k;
for (int i=0;i<n;i++){
scanf("%lf",&Len[i]);
Max=max(Max,Len[i]);
}
}
int main()
{
// freopen("a.txt","r",stdin);
Init();
double ln(0),rn(Max);
for (int i=1;i<=100;i++)
{
double mid=(ln+rn)/2;
if (Right(mid))
{
ln=mid;
}
else
{
rn=mid;
}
}
rn=(rn+ln)/2;
printf("%.2f\n",floor(rn*100)/100);
}
上面的代码和下面的代码仅仅在二分判断退出的地方不同,但是上面的却是WA,下面的AC。
#include <iostream>
#include <cstdio>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;
const int maxn=10000;
const double eps=0.001;
double Len[maxn];
int n,k;
double Max;
bool Right(double len)
{
int ans(0);
for (int i=0;i<n;i++)
{
ans+=(int)(Len[i]/len);
}
if (ans>=k)
return true;
else
return false;
}
void Init()
{
cin>>n>>k;
Max=0;
for (int i=0;i<n;i++)
{
scanf("%lf",&Len[i]);
Max=max(Max,Len[i]);
}
}
int main()
{
//freopen("a.txt","r",stdin);
Init();
double ln(0),rn(Max);
for (int i=1;i<=100;i++)
{
double mid=(ln+rn)/2;
if (Right(mid))
{
ln=mid;
}
else
{
rn=mid;
}
}
rn=(rn+ln)/2;
printf("%.2f\n",floor(rn*100)/100);
}
下面进行100次循环,每次二分,精度为lenmax>>100。
本例中N=10000,所以大概为1*e-27左右吧。
标签:blog io os for div sp 代码 log on
原文地址:http://www.cnblogs.com/dandi/p/3972213.html