乙個能看的題解!預備知識只有高中數學的【導數】。不用什麼偏導數/拉格朗日乘子法之類的我看不懂的東西( •̀∀•́ )!
如果你不知道什麼是導數,可以找本高中數學選修2-2來看一下!看第一章第1、2節就好啦。傳送門:選修2-2
感性理解一下這道題:
一開始,我們可以給所有路段隨便分配乙個速度。
接下來,我們需要在一些路段上耗費一定能量用來提速,以此縮短一定時間。不同路段上,花費單位能量能縮短的時間(簡稱「價效比」)是不同的,所以如果我們要模擬這個過程,一定是每時每刻都在當前價效比最高的路段上花費能量,直到能量花完為止。(似乎……也可以花費負的能量,增加某路段所需時間,然後把能量用到別的地方去。)
注意到乙個性質:隨著花費能量增加,價效比會越來越低。
這樣的話,只要按照上面這種貪心策略,時時刻刻在價效比最高的路段花費能量(並使它的價效比降低),最後達到最優解時,各路段價效比會一樣。
暴力模擬似乎是寫不出來的,考慮更正常的做法。
這個價效比是什麼呢?如果我們對每段路畫出乙個\(t-e\)函式圖象,表示該路段需要的時間\(t\)與花費的能量\(e\)的函式關係,那麼花費一定能量\(e\)之後的「價效比」是什麼呢?就是函式影象上橫座標為\(e\)處切線的斜率——導數。
那麼最優解就滿足——各路段導數一樣!
同時,這個公共導數(是負的)絕對值越小(價效比越低),所需能量越多,總時間越小。
於是二分這個導數,求出每段速度,以此求出所需能量,和手裡的總能量比較一下,就可以二分得到答案了!
以上是思路。現在開始數學。
要求出每段導數關於\(v\)的關係。
對於一段路來說(方便起見,把\(k\)乘上\(s\)作為新的\(k\),就可以少寫乙個字母了2333):
\[e = k(v - v')^2
\]\[t = \frac
\]那麼
\(\frac\)
$=\frac / \frac $
\(= -\frac / 2k(v - v')\)
\(= -\frac\)
然後二分公共導數\(x\),對於每段路解方程\(-\frac = x\)(可二分)得到\(v\),進而求出需要的能量。
**:
#include #include #include #include #include #define enter putchar('\n')
#define space putchar(' ')
using namespace std;
typedef long long ll;
template void read(t &x)
template void write(t x)
const int n = 10005, inf = 0x3f3f3f3f;
int n;
double e, s[n], k[n], u[n];
double getv(double x, int i)
mid = (l + r) / 2;
return (l + r) / 2;
}double calc(double x)
return sum;
}int main()
mid = (l + r) / 2;
double ans = 0;
for(int i = 1; i <= n; i++)
ans += s[i] / getv(mid, i);
printf("%.10lf\n", ans);
return 0;
}
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 騎行川藏
noi2012 騎行川藏 思路一 二分導數 考慮 價效比 即花費單位能量縮短的時間。如果我們給每一段隨機分配乙個速度,再調整 那麼一定選擇價效比最高的調整,或者把價效比較低的能量取回,再分配 而價效比隨著能量分配,會越來越低 可以發現的是,最後所有的n段的價效比一定都相同!如果存在不同的,那麼一定可...
2876 Noi2012 騎行川藏
time limit 20 sec memory limit 128 mbsec special judge submit 1243 solved 646 submit status discuss 蛋蛋非常熱衷於挑戰自我,今年暑假他準備沿川藏線騎著自行車從成都前往拉薩。川藏線的沿途有著非常美麗的風...