POJ1064 Cable master 【二分找最大值】

题目:题目太长了!

https://vjudge.net/problem/POJ-1064

题意分析:给了你N根长度为小数形式的棍子,再给出了你需要分的棍子的数量K,但要求你这K根棍子的长度必须是一样长的。需要你求解出满足题意的最长可能的棍子长度。根据二分找最大值的应用写即可。

需要注意的是:

1.注意题目给的范围是All cables are at least 1 meter and at most 100 kilometers in length;

2.在写满足条件的函数时,对于int强制转换类型的应用,一定要注意后面的括号;(起初这里WA的)

3.因为是找最大值,所以用right;

4.100次循环的二分写法可以达到2^100,即可以达到10^30,足够了。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 1e4+5;
int N, K;
double Data[MAXN];

bool fun(double x)
{
    int cnt = 0;
    for(int i = 0; i < N; i++)
        cnt += (int)(Data[i]/x); //cnt += (int)Data[i]/x; WA
    if(cnt >= K)
        return true;
    else
        return false;
}

void solve()
{
    double left = 0, right = 100001;
    double mid;
    for(int i = 0; i < 100; i++)
    {
         
        mid = (left+right)/2;
        if(fun(mid))
            left = mid;
        else
            right = mid;
    }
    printf("%.2f\n", floor(right*100)/100);
}

int main()
{
    while(~scanf("%d %d", &N, &K) )
    {
        for(int i = 0; i < N; i++)
            scanf("%lf", &Data[i]);
        solve();
    }

    return 0;
}

  

  

猜你喜欢

转载自www.cnblogs.com/dybala21/p/9671812.html