三分法
众所周知,二分法主要用来求函数的零点,那么三分法是二分法的变种,主要用来求单峰函数的极值点。
三分法的原理非常简单,每次对一个区间
[l,r]求三等分点lsec和rsec:l = l + lsec, r = r - rsec.
例题F-牛牛战队的比赛地_牛客2025秋季算法编程训练联赛5-基础组
查看代码#include<bits/stdc++.h> using namespace std; #define ll long long vector<pair<int, int>> v; double clc(double x){ double maxn = 0; for(auto& [x1, y1] : v){ double d = sqrt((x1 - x) * (x1 - x) + y1 * y1); if(d > maxn) maxn = d; } return maxn; } void solve(){ int n, x, y; cin >> n; for(int i = 1; i <= n; ++i){ cin >> x >> y; v.emplace_back(x, y); } double l = -40000, r = 40000; while(r - l >= 1e-8){ double lmid = l + (r - l) / 3; double rmid = r - (r - l) / 3; if(clc(lmid) <= clc(rmid)) { //ans = r; r = rmid; } else l = lmid; } cout << clc((l + r) / 2) << endl; return ; }题目中出现了“最大的最小”、“最小的最大”等字眼,一般情况都需要二分的写法,本题求最大距离距离的最小值,求的是极小值,我们可以用三分法来求解。
这段代码的核心思路是用三分法求解 “最大距离最小化” 问题。每次取[l, r]之间的三等分点比较
最后答案在更新后的[l, r]区间内。

浙公网安备 33010602011771号