地址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;
}
tql%%%