2023-1-18刷题情况
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
智力大冲浪
题目描述
小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者主持人为了表彰大家的勇气先奖励每个参赛者 m m m 元。先不要太高兴因为这些钱还不一定都是你的。接下来主持人宣布了比赛规则
首先比赛时间分为 n n n 个时段它又给出了很多小游戏每个小游戏都必须在规定期限 t i t_i ti 前完成。如果一个游戏没能在规定期限前完成则要从奖励费 m m m 元中扣去一部分钱 w i w_i wi w i w_i wi 为自然数不同的游戏扣去的钱是不一样的。当然每个游戏本身都很简单保证每个参赛者都能在一个时段内完成而且都必须从整时段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者小伟很想赢得冠军当然更想赢取最多的钱注意比赛绝对不会让参赛者赔钱!
输入格式
第一行为 m m m表示一开始奖励给每位参赛者的钱
第二行为 n n n表示有 n n n 个小游戏
第三行有 n n n 个数分别表示游戏 1 1 1 到 n n n 的规定完成期限
第四行有 n n n 个数分别表示游戏 1 1 1 到 n n n 不能在规定期限前完成的扣款数。
输出格式
输出仅一行表示小伟能赢取最多的钱。
样例 #1
样例输入 #1
10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
样例输出 #1
9950
提示
对于 100 % 100\% 100% 的数据 1 ≤ n ≤ 500 1 \le n \le 500 1≤n≤500 1 ≤ m ≤ 5 × 1 0 5 1 \le m \le 5 \times 10^5 1≤m≤5×105 1 ≤ t i ≤ n 1 \le t_i \le n 1≤ti≤n 1 ≤ w i ≤ 1000 1 \le w_i \le 1000 1≤wi≤1000。
思路
需要每个阶段需要取最大值那就需要舍去最小值可以使用小顶堆每次舍去掉最小值。
代码实现
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int ans = sc.nextInt();
int len = sc.nextInt();
int[][] arr = new int[len][2];
for(int i = 0; i < len; i++) arr[i][0] = sc.nextInt();
for(int i = 0; i < len; i++) arr[i][1] = sc.nextInt();
Arrays.sort(arr, (a, b) -> a[0] - b[0]);
PriorityQueue<Integer> queue = new PriorityQueue<>((a,b) -> a - b);
int time = 0;
for(int i = 0; i < len; i++){
if(arr[i][0] > time){
while(!queue.isEmpty() && queue.size() > time) ans -= queue.poll();
time = arr[i][0];
}
queue.add(arr[i][1]);
}
System.out.println(ans);
sc.close();
}
}