进攻策略蓝桥杯

1、进攻策略

问题描述
  植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物。
  首先,僵尸有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

样例输出
4
数据规模和约定
  对于70%的数据:n<=1000

对于100%的数据:n<=200000,m<=100,K<=1000000,所有Pi、Qi<=100000000

在这里插入图片描述

import java.io.ObjectInputStream.GetField;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class jingong {
  public static void main(String[] args) {
	Scanner s=new Scanner(System.in);
	//输入开始
	int m=s.nextInt();
	int n=s.nextInt();
	int k=s.nextInt();
	int []wi=new int[m];
	int []pi=new int[m];
	for(int i=0;i<pi.length;i++)
	{
		wi[i]=s.nextInt();//僵尸所耗资源
	}
	for(int i=0;i<pi.length;i++)
	{
		pi[i]=s.nextInt();//攻击效果
	}
	int[] qi=new int[n];
	for(int i=0;i<qi.length;i++) {
		qi[i]=s.nextInt();//每行的防守力
	}
	
	//键盘输入结束
	int T=0;
	for(int i=n-1;i>=0;i--)
	{
		for(int j=0;j+i>=i&&j+i<n;j++) {
			int a=k;
			int count=0;
			for(int z=j;z<=j+i;z++) {
				int x=getPrefferred(wi,pi,qi,z);
				if(a>=x)
				{
					count++;
					a-=x;
				}else {
					break;
				}
			}
			if(count>T)
			{
				T=count;
				if(T>=i+1)
				{
					System.out.println(T);
					return;
				}
			}
		}
	}
	System.out.println(T);
  }
  static Map<Integer,Integer> map=new HashMap<Integer,Integer>();
  public static int getPrefferred(int[] wi,int[] pi,int[] qi,int index)
  {
	  Integer dp=map.get(qi[index]);
	  if(dp!=null) return dp;
	  int price=Integer.MAX_VALUE;
	  int minIndex=0;
	  for(int i=0;i<wi.length;i++)
	  {
		  int pc=(int)(Math.ceil(qi[index]*1.0/pi[i])*wi[i]);
		  if(pc<price)
		  {
			  price=pc;
			  minIndex=i;
		  }
	  }
	  map.put(qi[index],price);
	  return price;
  }
}
1.Math.round():根据“round”的字面意思“附近、周围”,可以猜测该函数是求一个附近的整数,看下面几个例子就明白。

小数点后第一位<5
正数:Math.round(11.46)=11
负数:Math.round(-11.46)=-11
 
小数点后第一位>5
正数:Math.round(11.68)=12
负数:Math.round(-11.68)=-12
 
小数点后第一位=5
正数:Math.round(11.5)=12
负数:Math.round(-11.5)=-11
总结:(小数点后第一位)大于五全部加,等于五正数加,小于五全不加。
 
2.Math.ceil():根据“ceil”的字面意思“天花板”去理解;
例如:
Math.ceil(11.46)=Math.ceil(11.68)=Math.ceil(11.5)=12
Math.ceil(-11.46)=Math.ceil(-11.68)=Math.ceil(-11.5)=-11
 
3.Math.floor():根据“floor”的字面意思“地板”去理解;
例如:
Math.floor(11.46)=Math.floor(11.68)=Math.floor(11.5)=11
Math.floor(-11.46)=Math.floor(-11.68)=Math.floor(-11.5)=-12
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值