題意:在滿足∀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 蛋蛋非常熱衷於挑戰自我,今年暑假他準備沿川藏線騎著自行車從成都前往拉薩。川藏線的沿途有著非常美麗的風...