[noi2012]騎行川藏
思路一:二分導數
考慮「價效比」即花費單位能量縮短的時間。
如果我們給每一段隨機分配乙個速度,再調整
那麼一定選擇價效比最高的調整,或者把價效比較低的能量取回,再分配
而價效比隨著能量分配,會越來越低
可以發現的是,最後所有的n段的價效比一定都相同!
(如果存在不同的,那麼一定可以從價效比較低的收回一些能量,給價效比高的用,使得總時間更少)
由於實數範圍,所以暴力模擬用個堆什麼的不現實
考慮用數學方法:
每段的t-e影象是乙個類反比函式
每個點的斜率就是當前能量的價效比!
就是$e_i$位置的導數
也即,最後的所有影象$e_i$的導數都是一樣的!(並且都是負數)
而且可以發現,最後導數負數絕對值越小(導數越大),那麼花費的總能量越多,時間越短
所以有二分的性質!
二分導數,考慮怎麼檢驗
直觀的想法是求出t-e的導數關於e的函式,,,沒法求
但是,t和v的影象的導數就是y=si/x的導數可以求,e和v的導數根據關係式可以直接求
所以考慮通過v作為中介,求出t-e的導數關於v的函式
(看上面部落格)然後就得到了式子,對於二分的導數,解方程求出$v_i$,再求出$e_i$,通過e的總和判斷二分走向
至於解方程,就用二分即可。(由於等式一邊是正數,所以一定有$v_i>v_i'$)
一些精度問題:(本題精度要求還是比較高的)
1.二分解方程判斷的時候,能不用除法就不要用除法!但是不等式記得變號!(因為x小於零)
2.eps 1e-14(也可以不用eps,二分100次左右就結束(看人品。。。))
**:
#include#define il inline#define reg register int
#define numb (ch^'0')
using
namespace
std;
typedef
long
long
ll;il
void rd(int &x)
namespace
miracle
ret=(l+r)/2
;
return
ret;
}double che(double
mid)
return
sum;
}int
main()
double r=0.0,l=-100000000.00
;
int cnt=100
;
while(r-l>eps)
double mid=(l+r)/2.0
;
for(reg i=1;i<=n;++i)
printf(
"%.10lf
",ans);
return0;
}}signed main()
/*author: *miracle*
date: 2019/2/5 11:36:13
*/
思路二:拉格朗日乘數法
咕咕咕
NOI 2012 騎行川藏
題意 在滿足 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 令f...
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 蛋蛋非常熱衷於挑戰自我,今年暑假他準備沿川藏線騎著自行車從成都前往拉薩。川藏線的沿途有著非常美麗的風...