1. 程式人生 > >[模板]三分法

[模板]三分法

模板第二彈

題目選自:Luogu P3382
顯然三分。
標題就是三分。
先給個程式碼。
每次都給那麼長的程式碼,好像有點不太好,所以這次只給主程式碼(想要前面的很有意義莫名其妙的程式碼的可以翻我以前的部落格)。

double l,r,g[14],_1,_2;
int n;
#define eps 1e-7
double f(double x)
{
    double y=g[0];
    fr(i,1,n)
        y+=g[i]*pow(x,i);
    rt y;
}
int main(){
#ifndef ONLINE_JUDGE
    freopen(""
,"r",stdin); freopen("","w",stdout); #endif n=read(); scanf("%lf%lf",&l,&r); fd(i,n,0) scanf("%lf",&g[i]); while(l+eps<r) { _1=(l+l+r)/3; _2=(r+_1)/2; if(f(_1)<=f(_2)) l=_1; else r=_2; } printf("%.5lf"
,l); rt 0; }

可以參考一下:

Created with Raphaël 2.1.0startInput#1#2#4#3Outputend#5yesnoyesno

注:
#1:
mid1=2l+r3
mid2=l+2r3
#2
f(mid1)<=f(mid2)
#3
l+eps<r
#4
l=mid1
#5
r=mid2
eps
eps=107
解釋:

#1mid1,mid2設定為l,r的兩個三分點

#2判斷兩點函式值大小

#3判斷l,r值是否不足夠接近(區間是否足夠大)

#4捨去[l,mid1)

#5
捨去(mid2,r]

eps可以看做處理精度的標準

思路大概清晰了一些吧。
來梳理一下:
1. 該搞什麼初始化就搞什麼初始化
2. 重複執行3~5,直到精度足夠
3. 算出等分點
4. 分別求出亮等分點的函式值
5. 比較,並做相應處理(看是舍小還是舍大)
6. 得出結果
以上就是本部落格的精華部分,下期部落格,再見。

最後,祝大家:

rp=(unsigned long long)-1

相關推薦

[模板]

模板第二彈 題目選自:Luogu P3382 顯然三分。 標題就是三分。 先給個程式碼。 每次都給那麼長的程式碼,好像有點不太好,所以這次只給主程式碼(想要前面的很有意義莫名其妙的程式碼的可以

(洛谷3382 【模板

printf log 含義 三分 tps ans 區間 bits int 如題,給出一個N次函數,保證在範圍[l,r]內存在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出x的值。 輸入格式: 第一行一次包含一個正整數N和兩個實數l、r,含義如題目描述所示。

【luogu 3382】【模板

include 表示 時空 return 三分 %d color upload printf 題目描述 如題,給出一個N次函數,保證在範圍[l,r]內存在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出x的值。 輸入輸出格式 輸入格式: 第一行一次包含一個

[洛谷P3382]【模板

esp ace print 註意 兩個 分法 ont define nbsp 題目大意:給出一個N次函數,保證在範圍[l,r]內存在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出x的值。 解題思路:三分法。像我這種什麽函數都不知道的,只知道要三分。取兩個&ld

洛谷 P3382 【模板

href con fine pla div cstring new toolbar lba P3382 【模板】三分法 題目描述 如題,給出一個N次函數,保證在範圍[l,r]內存在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出

luogu3382【模板

algorithm namespace sca ring sin string 內存 AS CP 給出一個N次函數,保證在範圍[l,r]內存在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出x的值。 看代碼即可。 #include <cstdio>

#10013 曲線 (模板題)

ase ext namespace lin str scrip sel nts otto 【題目描述】     明明做作業的時候遇到了 n 個二次函數 S?i??(x)=ax?2??+bx+c,他突發奇想設計了一個新的函數 F(x)=max{Si(x)},i=1…n。 明

P3382 【模板

const tdi 好的 分法 pri cst max 。。 模擬退火 菜雞刷模板系列。。。 這道題其實是可以二分的,但是有更好的算法,叫做三分。 三分這種算法用於求單峰函數的最大值或者最小值。 算法思想就是弄\((l, r)\)區間的兩個三等分點,然後來縮小範圍。 因為這

模板

模板題:洛谷 \(P3382\) 給出一個 \(N\) 次函式,保證在範圍 \([l,r]\) 記憶體在一點 \(x\) ,使得 \([l,x]\) 上單調增,\([x,r]\) 上單調減。試求出 \(x\) 的值。 好的,三分就是用來求這種單峰函式的最值 具體求法: 與二分很像,先把答案鎖定在一個區間 \

模板講解

三分查詢 我們都知道 二分查詢 適用於單調函式中逼近求解某點的值。 如果遇到凸性或凹形函式時,可以用三分查詢求那個凸點或凹點。 下面的方法應該是三分查詢的一個變形。 如圖所示,已知左右端點L、R,要求找到白點的位置。 思路:通過不斷縮小 [L,R]

模板模板題:洛谷P3382)

題目描述 如題,給出一個N次函式,保證在範圍[l,r]記憶體在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出x的值。 輸入輸出格式 輸入格式: 第一行一次包含一個正整數N和兩個實數l、r,含義如題目描述所示。 第二行包含N+1個實數,從高到低依次表示該

洛谷P3382 【模板

題目連結 方法1 就是三分的模板之前轉載過了就不寫了 不過求多項式有兩種效率不一樣的方法可以作為參考; //普通的求多項式 /*double F(double x){ double f=0; for(int i=n;i>=0;i--){

模板

double solve(double MIN,double MAX) { double Left, Right; double mid, midmid; double mid

learning

二分法 分享 最值 函數 模板題 -1 sin ont clu 三分法和二分法有些類似,二分處理的是遞增/減的函數,而三分處理的是先遞增後遞減(或相反)的函數的最值。 int lm=l+(r-l)/3,rm=r-(r-l)/3; 如上圖,lm<rm,則函數最

[日常摸魚]

++ inline lin div const 今天 res 2.0 scan 翻到一個三分法的模板發現沒有寫掉…今天幹脆寫掉算了…(luogu3382) 跟二分基本差不多… #include<cstdio> typedef double dl; const

搜索

was mac span else wid ima 排序 water lin 二分法適用於求單調的時候用的,就比如說排序好的數組,那是遞增的或者遞減的。如果像出現了非單調函數那樣的怎麽求它的最值呢? 二分法早就失去了他的意義了。不過還是可以用三分法來實現的,就是二分中再

[LuoguP1883]函數

mat 三個點 while pan namespace pri cst abs 一個 三分法的模板,一直提交,一直WA 結果,今天把精度判斷從l-r>=t改成 fabs(F(l)-F(r))>=t ,過了三個點,再將 \(t\) 改成 \(10^{-7}\) 就

【數學】

Definition 當一個函式\(f(x)\)滿足在區間在區間\([l,r]\)內有且僅有一個\(x~\in~[l,r]~,~s.t.~~f(x)\)在\([l,x]\)內單調嚴格遞增,在\([x,r]\)內單調嚴格遞減,則說\(f(x)\)在\([l,r]\)內是一個單峰函式,求出單峰點\(x\)的演算

求單峰(單谷)函式極值

what is 三分法 對於二分,相信你一定十分熟悉。就是在一個具有單調性序列上查詢你所需要的數字。由於其單調性,你每一次在查詢是就可以將規模縮小一半,大致就是: 1.假設這個數列單調遞增 2.維護一個區間左端點\(l\),區間右端點r和中間點\(mid\) 3.如果\(mid\)比想要的值小,則左邊肯定

[SCOI2010]傳送帶

[SCOI2010]傳送帶 LG傳送門 三分法模板。 關於為什麼可以三分,我選擇感性理解,有人證明了,總之我是懶得證了。 假設路徑是\(A \to E \to F \to D\),\(E\)和\(F\)分別是從\(AB\)到平面上的拐角和從平面上到\(CD\)上的拐角。首先三分\(E\)的位置,在此基