试题 算法提高 进攻策略加强

资源限制
时间限制: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;
  }
  
  
在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值