題目描述
魔獸爭霸3中,戰略資源的採集通過使用農民、苦工、小精靈以及寺僧來進行。
在魔獸爭霸4的開發中,玻璃渣覺得這種模式太過單一,於是他們想新增更多的單位來使採集的模式更加豐富。
在新的模式中,玩家可以建造更多種類的「苦工」,不同的「苦工」的工作效率不同,同時,建造不同的「苦工」所需要的資源也是不一樣的。
玻璃渣出品的遊戲以追求平衡著稱,所以為了測試這種新的模式的平衡性,他們設計了一套檢測的方法:在各種族的起始資源相同時,測量達到某一資源數量的時間,如果相同則可以認為設計是平衡的。
他們將資料給你,希望你能測試出設計是否平衡。
輸入格式
第一行三個數,\(n, m, t\), 表示苦工的種類、開始時擁有的資源數量以及需要達到的資源的數量。
接下來\(n\)行,每行\(2\)個數\(a, b\), 表示生產這種苦工所需要的資源,以及這個苦工的效率,效率即為單位時間內產生的資源的數量。
輸出格式
乙個數字,表示資源數量達到t時的最少時間。
注意:與魔獸爭霸3不同,魔獸爭霸4中,生產苦工不需要時間。並且資源的採集並不連續,亦即如果乙個苦工的效率為\(2\),他會在時間為\(1\)的時候收穫\(2\)點資源,而並不會在時間為\(0.5\)的時候收穫\(1\)點資源。
輸入輸出樣例
輸入 #1
1 1 8
1 1
輸出 #14
輸入 #22 1 8
1 12 8
輸出 #23
資料範圍
對於\(30 \%\)的資料,\(n \le 10, m, t \le 300\)
對於\(100 \%\)的資料,\(n \le100,m, t \le 1000, a, b \le 2^\)
資料保證有解。
題意理解
就是有若干類苦力,每乙個苦力有乙個,每秒生產力,和購買需要花費的資源.苦力可以無限購買
初始的時候,你有一些資源,且問你達到目標資源數量的最少時間.
購買苦力是不需要花費時間.
演算法解析
這道題目是極為罕見的兩次dp演算法.
首先我們需要,固定花費\(x\)資源,可以購買最大的生產力為多少.
\[f[x]表示花費x個資源,購買的最大生產力
\]每乙個苦力看作乙個物品
每乙個苦力,可以無限購買
要求固定的資源,購買最大的生產力
其實這個就是完全揹包問題.
然後我們考慮,對於有固定的資源數量,在乙個固定的時間內,所擁有的最大生產力
\[f2[t][x]表示t個時間內,擁有x個資源的最大生產力
\]那麼我們顯然是要,購買生產力
那麼,假設我們花費\(k\)個資源,那麼得到最大多少生產力?
\[f[k]
\]這就是我們上次完全揹包的產物.
那麼下一秒,我們會擁有多少資源呢.
\[w=(j-k)+(f[k])+(f2[i][j]) \\\\下一秒資源=剩餘資源+本次新來生產力製造的資源+原本就有的生產力製造的資源
\]那麼根據本次推導,下一秒最大生產力為多少呢?
\[f2[i+1][w]=max(f2[i+1][w],f[k]+f2[i][j]);
\]既然如此,我們就成功的推導出來了,第二次的線性動態規劃演算法.
**解析
#include using namespace std;
const int n=1100;
int a[n],b[n],f[n],f2[n][n],n,m,ed;
inline void init()
memset(f,-1,sizeof(f));//消耗j點資源,可以得到的最大生產力
f[0]=0;
for(int i=1; i<=n; i++)
for(int j=a[i]; j<=1000; j++)//完全揹包轉移
if (f[j-a[i]]!=-1)
f[j]=max(f[j],f[j-a[i]]+b[i]);
memset(f2,-1,sizeof(f2));//-1是為了處理是否擁有這麼多資源
f2[0][m]=0;//初始化,f2[i][j]表示i單位時間後剩下j資源能擁有的最大生產力。
for(int i=0; i<=1000; i++)//i時刻
for(int j=0; j<=ed; j++)//當前擁有j點資源
f2[i+1][w]=max(f2[i+1][w],f[k]+f2[i][j]);//本次購買生產力+原本擁有的生產力
}} }
}signed main()
GDOI2014模擬 網格
description 某城市的街道呈網格狀,左下角座標為a 0,0 右上角座標為b n,m 其中n m。現在從a 0,0 點出發,只能沿著街道向正右方或者正上方行走,且不能經過圖示中直線左上方的點,即任何途徑的點 x,y 都要滿足x y,請問在這些前提下,到達b n,m 有多少種走法。輸入檔案中僅...
GDOI2014模擬 雨天的尾巴
給出乙個n個節點的樹和m次操作,每次操作把x到y的路徑上的所有的點的z種物品 1.求最後每個點最多的物品編號。若有多個相同的取編號小的,若沒有則輸出0.n,m 10 5,z 10 9 include include include include include define fo i,a,b fo...
GDOI2014模擬 伺服器
我們可以從n個數中選擇一些,選擇第i個數的代價為ci,且必須選擇n。對於每個沒有被選擇的數i,若它右邊離它最近的乙個被選擇的數是j,則代價為j i。求最小代價。n 10 6 n 2dp還是很顯然的。設fi表示i必須選,且i的右邊已經搞定了的最小代價,那麼fi min fk k i 1 k i 2 c...