京东笔试
1. 最小战力
你在玩一款游戏,在游戏中你不断地打倒敌人,并强化自己的战斗力。
这个游戏中没有小怪,只有若干个 boss,你把所有 boss 全部打败即完成游戏。
打 boss 的顺序可以自选。为了让你们计算起来更加轻松,我大大简化了每个 boss 的属性,
每个 boss 只有两项属性:
击败它需要的战斗力数值(大于等于该数值即可击败)、击败它之后,
你可以永久获得的战斗力增加数值。在游戏的开始,你可以获得一定的战斗力,
且这个战斗力与你花的钱成正比。你当然想尽可能地省钱,
因此请你计算出能够通关的的前提下,一开始获得的最小战斗力。
输入描述
第一行整数 n,表示 boss 数量。1 <= n <= 100000
后面 n 行,每行两个空格隔开的整数 x, y,表示击败这个 boss 需要的战斗力数值,击败它之后,你可以永久获得的战斗力增加数值。0 <= x, y <= 1000000000。
输出描述
一个整数,表示能通关的情况下,一开始获得的最小战斗力数值。
100%。
public static void minInputVal() {
Scanner scanner = new Scanner(System.in);
int number = Integer.parseInt(scanner.nextLine().trim());
List<int[]> vals = new ArrayList<>();
for (int i = 0; i < number; i++) {
String[] s = scanner.nextLine().trim().split(" ");
vals.add(new int[]{Integer.parseInt(s[0]), Integer.parseInt(s[1])});
}
vals.sort(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0] != o2[0]) return o1[0] - o2[0];
return o2[1] - o1[1];
}
});
int money = 0, initMoney = 0;
for (int[] val : vals) {
if(money < val[0]){
initMoney += val[0] - money;
money = val[0];
}
money += val[1];
}
System.out.println(initMoney);
} 2. 序列重排
给一个长度为n的序列A,你可以将序列中的元素按任意顺序重新排列,请你找到一种排列方式使得相邻两个数的差值之和最大,你只需要输出这个最大值即可。
输入描述
第一行整数 n,表示 boss 数量。1 <= n <= 100000
后面 n 行,每行两个空格隔开的整数 x, y,表示击败这个 boss 需要的战斗力数值,击败它之后,你可以永久获得的战斗力增加数值。0 <= x, y <= 1000000000。
输出描述
一个整数,表示能通关的情况下,一开始获得的最小战斗力数值。
采用最粗暴做法,通过27%,超时。还是记录下:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine().trim());
String[] s = scanner.nextLine().trim().split(" ");
List<Integer> vals = new ArrayList<>();
HashMap<Integer, Integer> visited = new HashMap<>();
for (int i = 0; i < n; i++) {
int key = Integer.parseInt(s[i]);
vals.add(key);
visited.put(key, visited.getOrDefault(key, 0) + 1);
}
vals.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
List<List<Integer>> res = new ArrayList<>();
dfs(vals, new ArrayList<Integer>(), res, visited);
int maxVal = Integer.MIN_VALUE;
for (List<Integer> re : res) {
maxVal = Math.max(maxVal, calcSum(re));
}
System.out.println(maxVal);
}
private static int calcSum(List<Integer> temp) {
int res = 0;
for (int i = 1; i < temp.size(); i++) {
res += Math.abs(temp.get(i - 1) - temp.get(i));
}
return res;
}
private static void dfs(List<Integer> vals, ArrayList<Integer> temp, List<List<Integer>> res,
HashMap<Integer, Integer> visited) {
if(temp.size() == vals.size()){
res.add(new ArrayList<>(temp));
return;
}
for (int i = 0; i < vals.size(); i++) {
int key = vals.get(i);
if(i != 0 && vals.get(i - 1) == key) continue;
if(visited.get(key) > 0){
visited.put(key, visited.get(key) - 1);
temp.add(key);
dfs(vals, temp, res, visited);
temp.remove(temp.size() - 1);
visited.put(key, visited.get(key) + 1);
}
}
} 该怎么做?
#京东##笔经#
查看15道真题和解析