题目描述
游戏俱乐部 , 有 n 个小游戏 , 其中第 i 个小游戏必须在 ti 时刻内完成 (假设玩家进入俱乐部时间为 0 时刻 , 开始游玩某一游戏只需要一个单位时间即可完成 ) 否则, 就会扣除 wi 点荣耀积分。
每天俱乐部都会向最优顺序选择者授予纪念勋章 , 所谓的最有顺序,即为:最终扣除的荣耀积分最少的玩家 。
输入描述:
T (1 <= T <= 1000) 组测试数据 ,
每组第一行输入一个整数 n (1 <= n <= 1000) ,代表游戏数目
第二行输入 n 个数 , t1 , t2 … tn (1 <= ti <= n) 依次代表各个游戏规定完成时间
第三行输入 n 个数 , w1 , w2 … wn (1 <= wi <= 100) ,依次代表各个游戏未在规定时间完成时 , 需要扣除的荣耀积分 。
输出描述:
每组数据输出一个整数 , 代表所扣除的最少荣耀积分数。
输入样例:
1
3
3 1 1
3 6 9
输出样例:
6
本题是腾讯2021年笔试真题 , 采用 贪心
的思想 , 首先 按照时刻升序 , 如果时刻相同 , 按照扣除积分降序 , 每次都选则完成某一刻中荣耀积分最多的游戏 。
例如 :
多款游戏在 t = 1 时刻开始 , 但是你只能完成一个游戏 , 为了扣除积分更少 ,选择荣耀积分最大的完成 。
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int T = input.nextInt();
while(T -- > 0) {
int n = input.nextInt();
int[][] game = new int[n][2];
for (int i = 0; i < n; i++) {
game[i][0] = input.nextInt();
}
for (int i = 0; i < n; i++) {
game[i][1] = input.nextInt();
}
// 二维数组: lambda 表达式的应用
Arrays.sort(game, (g1, g2) -> {
if (g1[0] == g2[0]) {
return g2[1] - g1[1];
}
return g1[0] - g2[0];
});
int secore = 0;
for(int i = 0 ; i < n ; i ++){
while(i < n - 1 && game[i + 1][0] == game[i][0]) {
secore += game[i + 1][1];
i ++;
}
}
System.out.println(secore);
}
}
}