洛谷 P3382(三分查詢凹點和凸點)

2021-09-27 13:28:35 字數 1980 閱讀 2253

題目鏈結

題目描述

如題,給出乙個n次函式,保證在範圍[l,r]內存在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出x的值。

輸入格式

第一行一次包含乙個正整數n和兩個實數l、r,含義如題目描述所示。

第二行包含n+1個實數,從高到低依次表示該n次函式各項的係數。

輸出格式

輸出為一行,包含乙個實數,即為x的值。四捨五入保留5位小數。

輸入輸出樣例

輸入

3

-0.9981

0.51-3-31

輸出

-

0.41421

說明/提示

時空限制:50ms,128m

資料規模:

對於100%的資料:7<=n<=13

樣例說明:

如圖所示,紅色段即為該函式f(x)=x3-3x2-3x+1在區間[-0.9981,0.5]上的影象。

當x=-0.41421時影象位於最高點,故此時函式在[l,x]上單調增,[x,r]上單調減,故x=-0.41421,輸出-0.41421。

(tip.l&r的範圍並不是非常大ww不會超過一位數)

三分的知識點

已知:左右端點l、r,要求找到上圖中空心點的位置

思路:通過不斷縮小 [l,r] 的範圍,無限逼近空心點

思想:先取[l,r] 的中點 mid,再取[mid,r] 的中點 mmid,通過比較 f(mid) 與 f(mmid) 的大小來縮小範圍。

當最後 l=r-1 時,再比較下這兩個點的值,我們就找到了答案。

1、當f(mid) > f(mmid)的時候,我們可以斷定mmid 一定在空心點的右邊

反證法:假設 mmid 在白點的左邊,則 mid 也一定在白點的左邊,又由 f(mid) > f(mmid) 可推出 mmid < mid,與已知矛盾,故假設不成立。

所以,此時可以將 r = mmid 來縮小範圍

2、當f(mid) < f(mmid)的時候,我們可以斷定mid 一定在空心點的左邊

反證法:假設 mid 在白點的右邊,則 mmid 也一定在白點的右邊,又由 f(mid) < f(mmid) 可推出 mid > mmid,與已知矛盾,故假設不成立。

同理,此時可以將l = mid 來縮小範圍

利用此思想可以用三分找到空心點的位置

**

#include

#include

#include

using

namespace

std;

#define

eps1e-12

intn

;doublel,

r,a[

20];double

solve

(doublex)

/*傳過來的x相當於函式表示式中的未知量,將未知量代入表示式,求得函式表示式的最終結果*/

return

sum;

}int

main()

printf

("%.5lf\n",l

);return0;

}

祝祖國繁榮昌

洛谷P3382 模板 三分法

題目鏈結 普通的求多項式 double f double x return f 秦九韶演算法從裡到外逐層計算一次多項式的值 double f double x 微積分求導 易證,若f x 0且f x dx f x dx 0則f x 必為原函式的乙個極大值或極小值 求駐點和零點 注 此題不含駐點 題目...

洛谷P3382 模板 三分法

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

洛谷 P3382 模板 三分法

dcmp是個好東西 先增後減求極大。如果f lm 大於f rm 那麼答案在 l,rm 之間 否則答案在 lm,r 之間 在這裡,等於無所謂 如果先減後增求極小,則大於和小於交換。如果忘了,畫張函式影象,舉些特例就知道了 曾經錯誤 見注釋掉的 include include using namespa...