time limit: 1000 ms
memory limit: 131072 kbytes
n 頭奶牛組隊參加自行車賽。車隊在比賽時排成一列,需要繞場s 圈。由於空氣阻力的作用,領隊奶牛消耗的體力要比後面的多。每頭奶牛的初始體力都是相同的,記作m,體力減為負數的奶牛只能中途退賽,體力也不會在比賽途中恢復,但最後只要有一位隊員到達終點就算完成了比賽。
比賽最小的單位時間是分鐘。車隊在每分鐘必須繞賽場整數圈,最少是每分鐘一圈。如果車隊在一分鐘裡繞場x圈,領隊奶牛會消耗sqr(x)點體力,跟在後面的所有奶牛將會消耗x點體力。每分鐘開始的時刻,車隊可以自由選擇是否換下領隊奶牛,讓其他奶牛做領隊,並且設定這一分鐘的速度。如果設定該分鐘的速度為x圈,則要保證領隊奶牛的體力至少要大於sqr(x)。
作為它們教練,請你計畫一下,應採用什麼樣的策略才能讓車隊以最快的時間完成比賽?輸入資料保證 s ≤ m,因此一定存在完成比賽的方案。
第一行:三個整數 n,m 和 s,1 ≤ n ≤ 20, 1 ≤ s ≤ m ≤ 100
單個整數:表示最早完成比賽的時間
3 30 20
7
(時間5領隊的奶牛為c)
再來寫一道dp
首先設計狀態
不不不,我們先來看資料範圍,1≤n≤20,1≤s≤m≤100,這麼小(露出邪♂惡的微笑)
那就大膽設計狀態f[i][j][k]表示領頭的為第i只奶牛走了j圈領頭的奶牛體力剩餘k的最少時間
為什麼這麼設計呢?
因為每頭奶牛的初始體力相同,如果在最優解中該頭奶牛還需繼續領頭則不要換奶牛
那麼開始轉移,這道題的轉移比較繞,因為資料小方程維數多,這道題有4重迴圈,很難受,其實這題的轉移只需分為兩種狀況,一種是由當前領頭奶牛繼續領頭,另一種是由上一頭奶牛換成這頭奶牛
接下來掛方程:
$f\left[ i \right]\left[ j \right]\left[ k \right] = min\left\f[i][j - l][k + l*l],1 < = l < = j\& \& k + l*l < = m - j + l\\f[i - 1][j - l][t],1 < = l < = j\& \& 0 < = t < = m\& \& m - j + l = = k + l}l\end \right.$
這裡還有乙個小優化(並不知道有沒有用),當你處理出f[i][j][k]時,你便可以更新f[i+1][j][m-j](即換乙隻奶牛)
答案只需掃一遍f[i][s][k]取min即可
**如下owo
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6int f[25][105][105
],n,m,s;
7int
main()820
}21int ans=2147483647;22
for (int i=1;i<=n;i++)
23for (int k=0;k<=m;k++) ans=min(ans,f[i][s][k]);
24 printf("%d"
,ans);
25return0;
26 }
Usaco2010 Feb 覆蓋牛棚
主要思路,並查集縮點 對於可以合併的欄杆,我們強行合併成乙個欄杆 當然要保證最優 然後一點點更新即可 include include using namespace std const int maxn 2e6 3 struct nodep maxn int nex maxn pos maxn ju...
USACO09FEB 改造路題解
題目鏈結 今天機房模擬賽的題目,先用爆搜做的,後面去寫了dijkstra 沒想到過掉了 本菜雞之前並沒有學過分層圖,所以我感覺用的是dijkstra加動態規劃的思想 我們用 dis i j 來表示到從1號牧場到第 i 號牧場公升級 j 條路所花的最短時間,設第 x 號牧場與第 i 號牧場相連通,ro...
P2983 USACO10FEB 購買巧克力
題解 注意題目開 long long 貪心策略 從低到高,買夠為止 反證 若剩下的有乙個k 比k小,那麼交換,穩賺不賠 所以,在買k之前,所有比他便宜的都買完了 include include include include include include include include using...