算法题:桃飘火焰焰,梨堕雪漠漠(Java贪心)

链接:桃飘火焰焰,梨堕雪漠漠
来源:牛客网

题目描述

在某游戏平台打折之际,EternityEternityEternity兴致勃勃地在该游戏平台上购买了nnn个不同的游戏,从1到nnn编号。

通过游览游戏论坛EternityEternityEternity确定了完成每个游戏的准确时间并在这nnn个游戏中找到了mmm个特别喜欢的游戏,这些游戏有个共同的特点,那就是都和火焰元素、雪元素相关!这让EternityEternityEternity爱不释手,这意味着EternityEternityEternity将必须去完成这mmm个游戏。


但是当EternityEternityEternity准备玩游戏时,EternityEternityEternity发现快要期末考试了,EternityEternityEternity需要忙着期末复习,但是EntityEntityEntity又经受不住游戏的诱惑,所以EternityEternityEternity决定抽出部分时间去玩至少kkk个游戏。但是EternityEternityEternity忙于玩游戏,所以请你求出EternityEternityEternity最少的游戏时间。

输入描述:

输出描述:

输出一行一个整数代表Eternity最少的游戏时间。

示例1

输入

5 2 3

1 2 3 4 5

2 4

输出

7

说明

Eternity很喜欢编号为2,4的游戏,他会花费2+4 = 6的时间先完成这两个游戏,完成这两个游戏过后,kkk - 2 = 1,所以只需要完成编号为1的游戏就能到达至少kkk个游戏的目标,所以总共花的时间为6 + 1 = 7。

 解题思路

首先我们知道Eternity最喜欢的游戏是必须玩的,所以我们先把他最喜欢游戏的时间加到总时间中。

之后在其他的游戏中贪心地选择时间最少地游戏即可。

那怎么避免我们在贪心选择时选择到必须玩地游戏呢?

我这里是在必须玩的游戏加到总时间之后,将它的时间变为 Integer.MAX_VALUE,这样确保不会再次选择到这个游戏。

Java代码实现

import java.util.Arrays;
import java.util.Scanner;

/**
 * Main
 *
 * @author Beau Wang
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int k = scanner.nextInt();
        int[] games = new int[n];
        for (int i = 0; i < games.length; i++) {
            games[i] = scanner.nextInt();
        }
        int[] likes = new int[m];
        for (int i = 0; i < likes.length; i++) {
            likes[i] = scanner.nextInt();
        }
        int time = 0;
        for (int j : likes) {
            time += games[j - 1];
            games[j - 1] = Integer.MAX_VALUE;
        }
        Arrays.sort(games);
        for (int i = 0; i < (k - m); i++) {
            time += games[i];
        }
        System.out.println(time);
    }
}

喜欢点个关注吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beau Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值