算法问题实战策略 DARPA大挑战 二分

地址https://algospot.com/judge/problem/read/DARPA

解答

二分选择间隔距离 然后进行尝试分配

两点之间距离大于等于该尝试距离则放置摄像头。

根据结果 二分扩展或者缩小距离 直到得到最接近答案的数值

DOUBLE的二分是有一点区别的 只要两者差小于一定小的数值就可以认为数值相等

另外double显示上还需要注意些细节。

// 11235.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <memory.h>
#include <iostream>
#include <iomanip>
using namespace std;

/*
//=======================================
3
2 4
80 100 120 140
4 4
80 100 120 140.00
4 7
0 70 90 120 200 210 220
//===========================
60.00
20.00
50.00
*/

int loop = 0;

int n, m;

const int N = 500;
double arr[N];

double ans = 0.0;


bool Check(double mid)
{
    int count = 1;
    double prevPoint = arr[0];
    for (int i = 1; i < m; i++) {
        if ((arr[i] - prevPoint) - mid > 0.00001) {
            //放置一个摄像机
            count++;
            prevPoint = arr[i];
        }
    }


    if (count >= n) {
        ans = mid;
        return true;
    }

    return false;
}



void solve()
{
    if (n == 2) {
        ans = arr[m - 1] - arr[0];
        cout << fixed << setprecision(2) << ans << endl;
        return;
    }

    double l = 0; double r = arr[m - 1] - arr[0];

    while (r - l > 0.00001) {
        double mid = (l + r) / 2.0;
        if (Check(mid)) l = mid;
        else r = mid;
    }
    cout << fixed << setprecision(2) << l << endl;
}


int main()
{
    cin >> loop;

    while (loop--) {
        cin >> n >> m;
        memset(arr, 0, sizeof(arr));
        for (int i = 0; i < m; i++) {
            cin >> arr[i];
        }

        solve();
    }

    return 0;
}
View Code
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
阿里打赏 微信打赏
原文地址:https://www.cnblogs.com/itdef/p/13439411.html