NOI 2012 騎行川藏

2021-08-03 07:49:44 字數 2011 閱讀 7541

題意:在滿足∀i

,vi≥

0且∑n

i=1k

isi(

vi−t

i)2≤

e 前提下最小化∑n

i=1s

i/vi

。學習了一下拉格朗日橙子乘子法。

對於函式f(

x1,x

2,⋯,

xn) 和g(

x1,x

2,⋯,

xn) ,在滿足g=

c(c為

常數) 的前提下求

f 的最小值。我們直觀地想象,所有極值點一定滿足∇f

=λ∇g

。令fi=

∂f/∂

xi,g

i=∂g

/∂xi

,我們可以得到一系列方程形如fi

=λgi

。再加上原本對

g 的約束g=

c總共n+

1 個方程n+

1 個變數,往往問題會變得簡單些(?)。然後對於所有可行的

λ 往回代到方程裡解出所有變數,然後計算

f ,但每組可行的解不一定是最優值,得要將所有的解算出來代入

f裡驗證才能得到最優解。

這其中的

λ 就是lagrange multiplier裡的multiplier啦。

回到這個題。顯然每段路能跑得越快越好,最後一定可以把體力給浪完,所以不等號可以換成等號。

這樣就變成了g(

v1..

.)=e

,最小化f(

v1..

.)=∑

ni=1

si/v

i 。

考慮應用拉格朗日乘子法,有 −1

v2i=

2λki

(vi−

ti),

∀i∈[

1,n]

回想題目裡的性質,首先vi

一定非負,其次vi

一定不小於ti

。這些方程的左邊是在二四象限的雙曲線,右邊是一條直線,因為vi

≥0所以一定只有乙個交點且

λ<

0 。因此我們可以知道對於所有

λ<

0 每個方程都有唯一解。現在我們只需解出滿足g=

e 的λ 。同樣從影象出發,當

λ 增大時,vi

也會增大,使得

g 一定增大,因此g隨

λ 遞增。

至此,我們只需要二分

λ 的值,然後解出每個vi

的值,判斷g 與

e的關係即可。最後再用二分出來的解算出

f 即為最優解啦。

時間複雜度o(

abn)

,其中a

為二分λ的次數,

b 為二分每個vi

的次數,取個40-50可能差不多吧。。。我是按精度來二分/三分的。。

#include 

using

namespace

std;

#define rep(i,a,b) for (int i = a, _ = b; i <= _; i ++)

const

int n = 10007;

const

double eps = 1e-14;

#define ****(a,b,x) a*sqr(x)*(x-b)+1

inline

double sqr(double x)

double s[n], k[n], t[n], e;

int n;

double solve(double a, double b)

return l;

}double get(double l)

return ret;

}int main()

double ans = 0;

rep (i , 1 , n)

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

return

0;}

NOI2012 騎行川藏

noi2012 騎行川藏 思路一 二分導數 考慮 價效比 即花費單位能量縮短的時間。如果我們給每一段隨機分配乙個速度,再調整 那麼一定選擇價效比最高的調整,或者把價效比較低的能量取回,再分配 而價效比隨著能量分配,會越來越低 可以發現的是,最後所有的n段的價效比一定都相同!如果存在不同的,那麼一定可...

NOI2012 騎行川藏 求導 二分

乙個能看的題解!預備知識只有高中數學的 導數 不用什麼偏導數 拉格朗日乘子法之類的我看不懂的東西 如果你不知道什麼是導數,可以找本高中數學選修2 2來看一下!看第一章第1 2節就好啦。傳送門 選修2 2 感性理解一下這道題 一開始,我們可以給所有路段隨便分配乙個速度。接下來,我們需要在一些路段上耗費...

2876 Noi2012 騎行川藏

time limit 20 sec memory limit 128 mbsec special judge submit 1243 solved 646 submit status discuss 蛋蛋非常熱衷於挑戰自我,今年暑假他準備沿川藏線騎著自行車從成都前往拉薩。川藏線的沿途有著非常美麗的風...