目录
F.桃飘火焰焰,梨堕雪漠漠
题目描述:
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述:
在某游戏平台打折之际,EternityEternityEternity兴致勃勃地在该游戏平台上购买了nnn个不同的游戏,从1到nnn编号。
通过游览游戏论坛EternityEternityEternity确定了完成每个游戏的准确时间并在这nnn个游戏中找到了mmm个特别喜欢的游戏,这些游戏有个共同的特点,那就是都和火焰元素、雪元素相关!这让EternityEternityEternity爱不释手,这意味着EternityEternityEternity将必须去完成这mmm个游戏。
但是当EternityEternityEternity准备玩游戏时,EternityEternityEternity发现快要期末考试了,EternityEternityEternity需要忙着期末复习,但是EntityEntityEntity又经受不住游戏的诱惑,所以EternityEternityEternity决定抽出部分时间去玩至少kkk个游戏。但是EternityEternityEternity忙于玩游戏,所以请你求出EternityEternityEternity最少的游戏时间。
输入描述:
第一行输入三个整数n,m,k(1≤n≤103,0≤m≤k≤n)n,m,k(1 \le n \le 10^3, 0 \le m \le k \le n)n,m,k(1≤n≤103,0≤m≤k≤n),nnn代表EternityEternityEternity购买的总共的游戏数量,mmm代表nnn个游戏中EternityEternityEternity喜欢的游戏数量,kkk代表EternityEternityEternity至少要玩的游戏数量。 第二行包含nnn个整数a1,a2,...,an(1≤ai≤105)a_1,a_2,...,a_n(1 \le a_i \le 10^5)a1,a2,...,an(1≤ai≤105),aia_iai代表完成第iii个游戏所需要的时间。 第三行包含mmm个整数b1,b2,...,bm(1≤bi≤n,保证bi各不相同)b_1,b_2,...,b_m(1 \leq b_i \leq n,保证b_i各不相同)b1,b2,...,bm(1≤bi≤n,保证bi各不相同),bib_ibi代表EternityEternityEternity特别喜欢的游戏编号。
输出描述:
输出一行一个整数代表EternityEternityEternity最少的游戏时间。
示例1
输入
5 2 3 1 2 3 4 5 2 4
输出
7
说明
EternityEternityEternity很喜欢编号为2,4的游戏,他会花费2+4 = 6的时间先完成这两个游戏,完成这两个游戏过后,kkk - 2 = 1,所以只需要完成编号为1的游戏就能到达至少kkk个游戏的目标,所以总共花的时间为6 + 1 = 7。
实现代码与解析:
排序
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int k = sc.nextInt();
int[][] time = new int[n + 1][2];
Set<Integer> set = new HashSet<>();
for (int i = 1; i <= n; i++) {
int[] t = new int[2];
t[0] = i;
t[1] = sc.nextInt();
time[i] = t;
}
for (int i = 0; i < m; i++) {
int l = sc.nextInt();
set.add(l);
}
Arrays.sort(time, (a, b) -> {
return a[1] - b[1];
});
int res = 0;
int t = 0;
for (int i = 1; i <= n; i++) {
if (set.contains(time[i][0])) {
res += time[i][1];
t++;
}
}
for (int i = 1; i <= n && t < k; i++) {
if (!set.contains(time[i][0])) {
res += time[i][1];
t++;
}
}
System.out.println(res);
}
}
原理思路:
模拟题,求最小的时间。
利用时间排序,如果想玩的游戏个数小于喜欢的游戏个数,就必须把所有喜欢的游戏玩完,如果想玩的游戏个数大于喜欢的游戏个数,那么再把所有喜欢的游戏玩完后,继续从消耗小的时间去选择不喜欢的游戏,直到到达最小玩完的游戏个数。
注意这题游戏编号就是输入顺序,而且从 1 开始,所以排序的时候要把原来的位置记住,用来根据位置判断是否喜欢。我就是没注意这个,想当然的就提交了。