題目
展開
題目描述
魔獸爭霸3中,戰略資源的採集通過使用農民、苦工、小精靈以及寺僧來進行。
在魔獸爭霸4的開發中,玻璃渣覺得這種模式太過單一,於是他們想添加更多的單位來使採集的模式更加豐富。
在新的模式中,玩家可以建造更多種類的“苦工”,不同的“苦工”的工作效率不同,同時,建造不同的“苦工”所需要的資源也是不一樣的。
玻璃渣出品的遊戲以追求平衡著稱,所以爲了測試這種新的模式的平衡性,他們設計了一套檢測的方法:在各種族的起始資源相同時,測量達到某一資源數量的時間,如果相同則可以認爲設計是平衡的。
他們將數據給你,希望你能測試出設計是否平衡。
輸入格式
第一行三個數,N, M, T, 表示苦工的種類、開始時擁有的資源數量以及需要達到的資源的數量。
接下來N行,每行2個數A, B, 表示生產這種苦工所需要的資源,以及這個苦工的效率,效率即爲單位時間內產生的資源的數量。
輸出格式
一個數字,表示資源數量達到T時的最少時間。
注意:與魔獸爭霸3不同,魔獸爭霸4中,生產苦工不需要時間。並且資源的採集並不連續,亦即如果一個苦工的效率爲2,他會在時間爲1的時候收穫2點資源,而並不會在時間爲0.5的時候收穫1點資源。
輸入輸出樣例
輸入 #1複製
1 1 8
1 1
輸出 #1複製
4
輸入 #2複製
2 1 8
1 1
2 8
輸出 #2複製
3
說明/提示
對於30%的數據,N<=10, M, T <= 300
對於100%的數據,N<=100,M, T <= 1000, A, B <= 2^31
數據保證有解。
思路
雙dp
先預處理一個完全揹包f,表示用i塊錢買到的最大效率
然後設dp[i][j]爲前i秒,還剩j塊錢,最大的效率
轉移顯然
代碼
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1077;
ll n,m,T,a[N],b[N],dp[N][N],f[N];
int main()
{
scanf("%d%d%d",&n,&m,&T);
if(m>=T)
{
printf("0"); return 0;
}
for(int i=1; i<=n; i++)
{
scanf("%lld%lld",&a[i],&b[i]);
if(a[i]==0&&b[i]>0)
{
printf("0"); return 0;
}
else if(a[i]==0&&b[i]==0) i--,n--;
}
for(int i=0; i<=T; i++) for(int j=1; j<=T; j++) dp[i][j]=-1;
for(int i=1; i<=n; i++) for(int j=a[i]; j<=T; j++) f[j]=max(f[j],f[j-a[i]]+b[i]);
dp[0][m]=0;
for(int i=0; i<=1000; i++) if(dp[i][T]!=-1)
{
printf("%d\n",i);
return 0;
}
else for(int j=1; j<=T; j++) if(dp[i][j]!=-1)
{
for(int k=1; k<=j; k++)
{
if(f[k]==0) continue;
ll w=(j-k)+f[k]+dp[i][j];
if(w>=T)
{
printf("%d\n",i+1); return 0;
}
dp[i+1][w]=max(dp[i+1][w],dp[i][j]+f[k]);
}
}
}