京东3.19后端笔试题
代码是可以优化的,随手写的提交比较快看看思路就好细节可以优化完成。
第一题 贪心模拟即可
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt(); //坦克
int b = in.nextInt(); //碉堡血量
int c = in.nextInt(); //一个碉堡炸c
int d = in.nextInt(); //碉堡数量
int cur = b; //初始化血量最少的碉堡血量为cur,刚开始为b
int count = 0;
while (a != 0 && d != 0) { //如果坦克或碉堡任意为0结束
count++;
int tank = a; //坦克的攻击力总点数
if (tank < cur) {
cur -= tank; //未能消灭碉堡
} else {
while (tank >= cur && d != 0) {
d--;
tank -= cur;
cur = b;
}
if (d == 0) break; //碉堡全灭直接结束
cur -= tank;
}
if (a - d * c > 0) {
a = a - d * c; // 坦克未被全灭
} else {
a = 0; // 坦克被全灭(包括负数情形都设置为0)
break;
}
}
if (a == 0 && d != 0) {
System.out.println(-1);
} else {
System.out.println(count);
}
}
} 第二题 维护一个最大堆,从任意节点开始遍历,每次取最大value边出来,然后再加入连通的边且下一个点未访问过(保证一个最大所以不走回头路) import java.util.*;
class edge {
int dst, value;
}
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
List<List<edge>> edges = new ArrayList<>();
for (int i = 0; i <= n; i++) {
edges.add(new LinkedList<>());
}
int u, v, p;
for (int i = 0; i < m; i++) {
u = in.nextInt();
v = in.nextInt();
p = in.nextInt();
edge e = new edge();
e.dst = v;
e.value = p;
edges.get(u).add(e);
edge e1 = new edge();
e1.dst = u;
e1.value = p;
edges.get(v).add(e1); //可以给edge类加上带参构造方法把这一段变成2行时间关系不写了
}
Set<Integer> set = new HashSet<>();
PriorityQueue<edge> pq = new PriorityQueue<>(new Comparator<edge>() { @Override public int compare(edge o1, edge o2) {
return o2.value - o1.value;
}
}); //存放边的大根堆
set.add(1); //随便选一个点进入set
pq.addAll(edges.get(1)); //将该点所有连通边加入大根堆
int max = Integer.MAX_VALUE; //用来维护路径上经过的最大的最小边权
while (!pq.isEmpty()) {
edge e = pq.poll();
max = Math.min(max, e.value);
set.add(e.dst);
for (edge edge : edges.get(e.dst)) {
if (!set.contains(edge.dst)) {
pq.add(edge);
}
}
if (set.size() == n) {
break;
}
}
System.out.println(max);
}
}
