植物大战僵尸作为一款曾经风靡全球的小游戏,是当代无数大学生的童年回忆,现在就让我们对它的回忆更深刻一点吧!
假设有一只僵尸与戴夫的家门呈一条直线(视为X轴),忽略僵尸可能会摔倒,豌豆可能会卡壳等一切影响因素,将僵尸、植物
戴夫看作是 "一个大小可忽略的点"即可。
home plant <- zombi
|-----|-----------------------------------------------------------------|
0 100 L (cm)
如上所示,一开始僵尸在戴夫家门口正前方坐标L(cm)处,戴夫在坐标100处种了一颗豌豆射手,无论僵尸站的有多远,豌豆射手每隔两秒都会发射一枚豌豆攻击僵尸,如果僵尸走到豌豆射手面前还没被击倒的话,豌豆射手则会被僵尸一脚踹飞(踹的过程耗时忽略不计)。这时你以为这样戴夫的脑袋瓜子就完蛋了?嘿嘿,那可不一定!戴夫会拿起头上的平底锅,等到僵尸抵达坐标0的那一刻,用尽全身力气必定给僵尸爆头一击,然后瘫倒在地。如果此时僵尸还没被击倒......oh~NO!
求僵尸被击倒(血条被清空)的一瞬间,所在的x轴坐标值,或者是......oh~NO! + 僵尸剩余血量
输入格式:
第一行给出五个正整数,依次为 N ,M ,L,K ,V
- N 表示豌豆射手每发豌豆的威力 (豌豆飞行过程耗时忽略不计) ,[1,20]
- M 表示戴夫手拿平底锅,一击爆头的威力,[1,100]
- L 表示僵尸一开始的里戴夫家门口的距离 ,[10^3,10^7]
- K 为僵尸的初始血量 ,[100,10^7]
- V 为僵尸每秒钟前进的距离,[1,500]
N M L K V
输出格式:
如果僵尸被击倒,则输出僵尸被击倒时的x坐标
反之输出......oh~NO!+僵尸剩余血量
输入样例1:
2 10 1000 800 1
输出样例1:
200
输入样例2:
1 10 1000 800 1
输出样例2:
......oh~NO!340
我的代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Integer N,M,L,K,V,time;
N=sc.nextInt();
M=sc.nextInt();
L=sc.nextInt();
K=sc.nextInt();
V=sc.nextInt();
time=0;
//缩小数据量
num n=new num(N,M,L,K,V,time);
n.start();
N=n.N;
M=n.M;
L=n.L;
K=n.K;
V=n.V;
//借助初始化之后的数据来创建各个对象
time=n.time;
zombi js=new zombi(K,L,V);
dave me=new dave(M);
plant zw=new plant(N);
while (true){
time++;
//僵尸一秒一步
js.run();
if(js.length< zw.length){
js.kick(zw);
}
//两秒一颗豌豆
if(time%2==0&&zw.tag){
zw.attack(js);
}
if(js.length<=0){
me.pot(js);
if(js.blood<=0){
System.out.printf("%d",0);
}else {
System.out.printf("......oh~NO!%d\n",js.blood);
}
break;
}
if(js.blood<=0){
System.out.printf("%d",js.length);
break;
}
}
}
}
//僵尸类,有踹飞植物的功能,往前行走的功能, 属性血条,距离戴夫的距离,每一步的步数
class zombi{
public int blood;
public int length;
int step;
void run(){
length-=step;
}
void kick(plant it){
it.tag=false;
}
public zombi(int blood, int length, int step) {
this.blood = blood;
this.length = length;
this.step = step;
}
}
//植物类,功能吐出豌豆,属性是否被僵尸干掉,伤害量,初始种植距离,题目中恒为100
class plant{
public final int length=100;
public int hurt;
public boolean tag=true;
void attack(zombi it){
it.blood-=hurt;
}
public plant(int hurt) {
this.hurt = hurt;
}
}
//戴夫类,属性平底锅伤害,挥出平底锅的功能
class dave{
int hurt;
void pot(zombi it){
it.blood-=hurt;
}
public dave(int hurt) {
this.hurt = hurt;
}
}
//存储输入的数据和初始化数据的类
class num{
public Integer N,M,L,K,V,time;
public num(Integer n, Integer m, Integer l, Integer k, Integer v, Integer time) {
N = n;
M = m;
L = l;
K = k;
V = v;
this.time = time;
}
//写完之后第一次提交发现步数小,距离很大的时候会超时,于是补了一个初始化函数,减少一些重复且无效的步骤
void start(){
if(L>1000){
if(K/((L-100)/V+1)/N>0){
time=(L-100)/V;
L-=time*V;
K-=time/2*N;
}else {
time=K/N-1;
L-=time*V;
K-=time/2*N;
}
}
}
}