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