USACO2002 Feb 奶牛自行車隊

2022-09-02 00:15:15 字數 1718 閱讀 6737

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 #include5

using

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 }

view code

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...