三分法初探

2022-04-30 07:36:08 字數 2914 閱讀 4196

[uva error curves]一些二次函式取max的交集還是乙個下凸函式。三分即可

#include #define maxn 10010

using namespace std;

int n, a[maxn], b[maxn], c[maxn];

#define f(i, x) a[i] * x * x + b[i] * x + c[i]

inline double cal(double x)

inline void solve()

printf("%.4lf\n", cal(l));

}int main()

return 0;

}

[zoj light bulb]列出數學式子,是乙個對勾函式(可以直接解),或者三分,注意影子到地上的判斷,不過d-x≤h??

#include using namespace std;

double h, h, d, p, q;

inline double check(double x)

void solve()

printf("%.3lf\n", check(r));

}int main()

return 0;

}

[hdu line belt]三分再三分

#include using namespace std;

struct point

}a, b, c, d;

#define sqr(x) (x)*(x)

double len(const point& a, const point& b)

int p, q, r;

double t(double a, double b)

double check(double a)return t(a, r);

}int main()

printf("%.2lf\n", check(r));

} return 0;

}

[poj 3301]texas trip

如果平行於座標軸的正方形很好計算

如何計算歪的正方形嘞??

旋轉角度嘛。乙個關於旋轉角度的下凸函式

然後三分角度qaq orz神

#include #include #include #define maxn 100

using namespace std;

int n;

struct pointa[maxn], b[maxn];

#define sqr(x) x * x

double check()

return sqr(max(rg - lf, up - dw));

}const double pi = acos(-1.0);

double mdf(double x)

return check();

}void solve()

printf("%.2lf\n", mdf(l));

}int main()

return 0;

}

[codeforces 605c]

首先這是乙個線性規劃問題,有100000個變元,2個約束條件。0並不是乙個初始解,所以對偶一下,100000個約束條件,2個變元。發現並不能線性規劃單純形,考慮一些半平面的交是上凸函式,所以確定y1可以找出y2的值,所以可以三分啦(然而標解是二分+凸包)

#include #define maxn 100010

using namespace std;

int n, p, q;

int a[maxn], b[maxn];

double check(double y)

int main()

double l = 0, r = 1.0 / x;

for(int i = 1; i <= 300; i ++)

printf("%.12lf\n", check(l));

return 0;

}

[sdoi 2013]保護出題人

#include #define maxn 100010

using namespace std;

typedef long long ll;

ll n, d;

ll a[maxn], x[maxn];

/*每一關的獨立性。

攻擊力 = max((sum[i] - sum[j-1]) / (xi + (i - j) * d))

*/ll sum[maxn];

struct point

};double operator * (const point& a, const point& b)

point st[maxn];

point operator - (const point &a, const point &b)

int top;

int i;

double check(int p)

int main()

int mx = l;

for(int j = l + 1; j <= r; j ++)

if(check(j) > check(mx))

mx = j;

l = mx;

ans += (double)(sum[i] - st[l].y) / (x[i] + i * d - st[l].x);

}printf("%.0lf\n", ans);

return 0;}/*

input

5 23 3

1 110 8

4 82 3

output

7 1≤n≤10^5,1≤d≤10^12,1≤x≤10^12,1≤a≤10^12

*/

三分法(洛谷3382 模板 三分法)

如題,給出乙個n次函式,保證在範圍 l,r 內存在一點x,使得 l,x 上單調增,x,r 上單調減。試求出x的值。輸入格式 第一行一次包含乙個正整數n和兩個實數l r,含義如題目描述所示。第二行包含n 1個實數,從高到低依次表示該n次函式各項的係數。輸出格式 輸出為一行,包含乙個實數,即為x的值。四...

三分法小結

二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸性函式時,二分法就無法適用,這時三分法就可以 大顯身手 如圖,類似二分的定義left和right,mid left right 2,midmid mid right 2 如果mid靠近極值點,則right midmid 否則...

三分法查詢

我們都知道 二分查詢 適用於單調函式中逼近求解某點的值。如果遇到凸性或凹形函式時,可以用三分查詢求那個凸點或凹點。下面的方法應該是三分查詢的乙個變形。如圖所示,已知左右端點l r,要求找到白點的位置。思路 通過不斷縮小 l,r 的範圍,無限逼近白點。做法 先取 l,r 的中點 mid,再取 mid,...