资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物。
首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻。使用第i种僵尸需要花费Wi资源,可以得到Pi的攻击效果。在这里,我们认为多个僵尸总的攻击效果就是他们每个攻击效果的代数和。
地图共有n行,对于第i行,最左端有若干植物,这些植物需要至少Qi的攻击才能被全部消灭。若一行上的植物全部被消灭,我们称这一行被攻破。
由于资源紧张,你只有总量为K的资源,不一定能够攻破所有行。但统治者希望攻破相邻的T行,并希望T尽量的大。你能帮他算出T的值吗?
输入格式
第一行三个非负整数:m、n、K;
第二行m个正整数,第i个数表示Wi;
第三行m个正整数,第i个数表示Pi;
第四行n个非负整数,第i个数表示Qi。
输出格式
3 11 39
5 2 11
3 1 7
5 3 6 10 3 2 4 200 1 1 1
样例输入
一个满足题目要求的输入范例。
例:
2 2
1 2
3 4
样例输出
4
数据规模和约定
对于70%的数据:n<=1000
对于100%的数据:n<=200000,m<=100,K<=1000000,所有Pi、Qi<=100000000
#include<iostream>
using namespace std;
int min1(int s,int d);
struct peo //建立对象人
{
int W;
int P;
};
peo a[100];
int Q[200000];
int main()
{
int m,i,n,k;
cin>>m>>n>>k;
for(i=0;i<m;i++)
cin>>a[i].W;
for(i=0;i<m;i++)
cin>>a[i].P;
for(i=0;i<n;i++)
cin>>Q[i];
int max1=0;
for(i=0;i<n;i++) //得到最大Qi
{
if(max1<Q[i])
max1=Q[i];
}
int **dp,k1=k; //建立dp动态二维数组 不会超限
dp=new int*[m];
for(i = 0;i < m;i++)
dp[i]=new int[max1];
int j;
for(i=0;i<=max1;i++) //第一行
{
if(i%a[0].P==0)
dp[0][i]=i/a[0].P*a[0].W;
else
dp[0][i]=(i/a[0].P+1)*a[0].W;
}
for(int i=1;i<m;i++) //得到后几行 最后一排为最少所需的资源
{
for(j=0;j<=max1;j++)
{
if(j/a[i].P==0)
{
int w=a[i].W;
dp[i][j]=min1(w,dp[i-1][j]);
}
else
{
int q=j-a[i].P;
int w=a[i].W+dp[i][q];
dp[i][j]=min1(w,dp[i-1][j]);
}
}
}
int sart=0,end=0,T=0,Tmax=0; //类似与尺取法
while(end<n)
{
if(k>=dp[m-1][Q[end]])
{
k=k-dp[m-1][Q[end]];
end++;
T++;
if(T>Tmax)
Tmax=T;
}
else
{
k=k+dp[m-1][Q[sart]];
sart++;
T--;
}
}
cout<<Tmax;
return 0;
}
int min1(int s,int d)
{
if(s>d)
return d;
else
return s;
}
在这里插入代码片