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
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/149cfeeaf5e165ddaf4fdc7227ab1ca4.jpeg)
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