腾讯笔试:荣耀积分

题目描述


游戏俱乐部 , 有 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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值