8.28网易互娱后端笔试
第一题,模拟杀怪游戏,求主角的最低生命值设置为多少?
思路就是血量H从0开始,模拟互砍,H出现负值就取反加到count,H初始化为0。最后count的结果是整个杀怪结束血量为0的情况,返回count+1。
import java.util.*;
public class Main {
static int[] Ai,Bi,Hi;
static int A,B,H,count ;
static int n,t;
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
t=in.nextInt();
for (int group=0; group<t; group++) {
n=in.nextInt();
A=in.nextInt();
B=in.nextInt();
H=0;
Ai=new int[n];
Bi=new int[n];
Hi=new int[n];
for (int i=0; i<n; i++) {
Ai[i]=in.nextInt();
Bi[i]=in.nextInt();
Hi[i]=in.nextInt();
}
count=0;
H=getMinH();
System.out.println(H);
}
}
private static int getMinH() {
//主角和怪兽真实伤害
int[] userActualDamage=geyUserActualDamage();
int[] beastActualDamage=geyBeastActualDamage();
//若主角真实伤害为0,返回-1
if (containZeroDamage(userActualDamage))
return -1;
else {
for (int i=0; i<n; i++) {
//模拟互砍
while (Hi[i]>0){
Hi[i]-=(userActualDamage[i]>0?userActualDamage[i]:0);
//主角被动,恢复血量
if (Hi[i]<=0){
H+=(-Hi[i]);
}
else {
H-=(beastActualDamage[i]>0?beastActualDamage[i]:0);
//若主角血量为负值记录到count,并初始化为0
if (H<0) {
count+=(-H);
H=0;
}
}
}
}
return count+1;
}
}
private static boolean containZeroDamage(int[] arr) {
for (int i : arr) {
if (i<0)
return true;
}
return false;
}
private static int[] geyUserActualDamage() {
int arr[]=new int[Bi.length];
for (int i=0; i<Bi.length; i++) {
arr[i]=A-Bi[i];
}
return arr;
}
private static int[] geyBeastActualDamage() {
int arr[]=new int[Ai.length];
for (int i=0; i<Bi.length; i++) {
arr[i]=Ai[i]-B;
}
return arr;
}
}
第二题,应该是有向无环图最短路径,跟LeetCode课程表那道题比较像,参考着改应该就可以了。
第三题,鱼缸注水。题干里小写L我一直以为是数字1,看半天没看明白。解决思路应该是模拟计算吧,难点在算假山在注入水时候的在水中的体积。
#网易互娱笔试##笔经##网易互娱#
查看23道真题和解析