首页 > 代码库 > POJ 1064

POJ 1064

 

 

///2.假定一个解并判断是否可行
///POJ1064
/**
    Q:有N条绳子,长度分别为Li,从中切割出k条长度相同的绳子,
    这K条绳子最长能有多长?保留两位小数
    A:
    二分搜索模型。
    条件C(x):=可以得到K条长度为x的绳子
    问题转变为 求满足C(x)的最大x;lb=0 ub=INF
    问题转变为 如何高效的判断C(x)

    1.二分搜索模型:在求最优解问题上的应用
    “求满足条件C(x)的最小x”->若所有的x‘>=x也满足C(x),则可用二分搜索来解决

*/

#include"iostream"
#include "cstdio"
#include "cmath"
using namespace std;

#define MAX 100010
#define INF 0x3f3f3f3f
int N,K;
double L[MAX];
bool C(double x)
{
    int num=0;
    for(int i=0;i<N;i++)
    {
        num+=(int)(L[i]/x);
    }
    return num>=K;
}
void solve()
{
    ///初始化解的范围
    double lb=0.0,ub=INF;

    ///重复循环,直到解的范围足够小
    for(int i=1;i<=100;i++)
    {
        double mid=(lb+ub)/2;
        if(C(mid))
            lb=mid;///长度还可以大点
        else
            ub=mid;
    }
    printf("%.2f\n",floor(ub*100)/100);///保留两位小数处理,ub代表最大符合
}

int main()
{
    while(~scanf("%d%d",&N,&K))
    {
        for(int i=0;i<N;i++)
        {
            scanf("%lf",&L[i]);
        }
        solve();
    }
    return 0;
}
/**
4 11
8.02
7.43
4.57
5.39
Sample Output

2.00
*/

 

POJ 1064