[GDOI2014]採集資源

題目

展開
題目描述
魔獸爭霸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]);
		}
	}
}













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章