题目描述牛牛选择报酬最高的工作

链接:https://www.nowcoder.com/questionTerminal/46e837a4ea9144f5ad2021658cb54c4d
来源:牛客网

题目描述
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。
输出描述:
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
示例1
输入
复制
3 3
1 100
10 1000
1000000000 1001
9 10 1000000000
输出
复制
100
1000
1001

大思路:定义一个Job类,再定义一个比较器,先按难度从低到高排列,难度相同的,由报酬从高到底排列。然后排序输入的job数组,难度不同的,去掉报酬低难度高的元素;难度相同的,去掉报酬低的工作,把这些元素都加到TreeMap里面。最后再用小伙伴数组每次查TreeMap的floorKey,如果为null,则不能找到工作,返回0;如果不为null,获取key对应的value就是最高报酬。

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeMap;

public class Main {

//Job类
static class Job {
    int hard;
    int money;

    public Job(int hard, int money) {
        this.hard = hard;
        this.money = money;
    }
}

//Job比较器,先按难度从低到高排列,难度相同的,由报酬从高到底排列
public static class JobComparator implements Comparator<Job> {
    public int compare(Job job1, Job job2) {
        return (job1.hard != job2.hard) ? (job1.hard - job2.hard) : (job2.money - job1.money);
    }
}

public static void process(Job[] job, int[] friends) {
    if (job.length < 1 || friends.length < 1) {
        return;
    }
    //排序job数组,难度不同的,去掉报酬低难度高的元素;难度相同的,去掉报酬低的工作,把这些元素都加到TreeMap里面
    Arrays.sort(job, new JobComparator());

    TreeMap<Integer, Integer> map = new TreeMap<>();
    map.put(job[0].hard, job[0].money);
    Job pre = job[0];
    for (int i = 1; i < job.length; ++i) {
        if (job[i].hard != pre.hard && job[i].money > pre.money) {
            pre = job[i];
            map.put(job[i].hard, job[i].money);
        }
    }

    // 小伙伴数组每次查TreeMap的floorKey,如果为null,则不能找到工作,返回0;如果不为null,获取key对应的value就是最高报酬
    for (int i = 0; i < friends.length; ++i) {
        if (map.floorKey(friends[i]) == null) {
            System.out.println(0 + " ");
        } else {
            System.out.println(map.get(map.floorKey(friends[i])) + " ");
        }
    }
}

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int n = sc.nextInt();
    int m = sc.nextInt();

    Job[] jobs = new Job[n];
    for (int i = 0; i < n; ++i) {
        int hard = sc.nextInt();
        int money = sc.nextInt();
        jobs[i] = new Job(hard, money);
    }

    int[] friends = new int[m];
    for (int i = 0; i < m; ++i) {
        friends[i] = sc.nextInt();
    }
    //调用主方法
    process(jobs, friends);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值