1. 程式人生 > 實用技巧 >一本通 1.2 例 3【曲線】

一本通 1.2 例 3【曲線】

題目link:https://loj.ac/problem/10013

經典的三分裸題。

三分主要是用來求一個滿足單峰性的函式的最大/最小值的一種演算法,其原理和二分基本一樣。假設求最小值,首先把選擇區域分為三段,然後比較這兩個三等分點的函式值誰更小一些,大的那一邊就不要了(如果大的是靠左的,那就連著左邊不要了,靠右同理),容易證明這樣做是正確的,然後像二分那樣遞迴下去就可以得解。

這道題是裸題思路就沒什麼好說的了。

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 int T, n, a[100010
], b[100010], c[100010]; 5 double cal(double x) 6 { 7 double ans = -INF; 8 for(int i = 1; i <= n; ++i) ans = max(ans, a[i] * x * x + b[i] * x + c[i]); 9 return ans; 10 } 11 double half() 12 { 13 double ans = 0, l = 0, r = 1000; 14 for(int o = 1; o <= 100; ++o) 15 { 16 double
mid1 = l + (r - l) / 3, mid2 = r - (r - l) / 3; 17 if(cal(mid1) < cal(mid2)) ans = mid1, r = mid2; else l = mid1; 18 } 19 return cal(ans); 20 } 21 int main() 22 { 23 scanf("%d", &T); 24 while(T--) 25 { 26 scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("
%d %d %d", &a[i], &b[i], &c[i]); 27 printf("%.4lf\n", half()); 28 } 29 return 0; 30 }