[2019网易实习编程题]牛牛找工作

本文介绍了一种通过难度和报酬为多个伙伴选择最优工作的算法。该算法首先将所有工作按难度排序,并为每位伙伴匹配最高报酬的工作。核心步骤包括:建立工作难度与报酬的映射表、将工作和伙伴的能力值合并并排序、根据排序结果更新最大报酬。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量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

从牛客网上找到别人分享的办法

public static void WorkSolution() {
		/*
		 * hashmap中先存入工作,对应的键(能力---工资) 如果人的能力不与hashmap中工作能力相等,存入hashmap,对应报酬0
		 * a(n+m)中先存入工作能力,在存入人的能力,最后排序 b数组中存入人的工作能力
		 * 在hashmap中根据a数组中的元素,找最大的报酬,再次存入hashmap 根据b数组人的能力找到相应的工资
		 */
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int t1 = 0, t2 = 0;
		HashMap hs = new HashMap();
		int[] a = new int[n + m];
		int[] b = new int[m];
		for (int i = 0; i < n; i++) {
			t1 = sc.nextInt();
			t2 = sc.nextInt();
			a[i] = t1;
			hs.put(t1, t2);
		}
		for (int i = 0; i < m; i++) {
			t1 = sc.nextInt();
			a[n + i] = t1;
			b[i] = t1;
			// 有人的能力hash表中没有
			if (!hs.containsKey(t1)) {
				hs.put(t1, 0);
			}

		}
		// 数组里面有人的能力以及工作的能力,排序
		Arrays.sort(a);

		int max = 0;
		for (int i = 0; i < m + n; i++) {
			max = Math.max(max, (int) hs.get(a[i]));
			hs.put(a[i], max);
		}
		for (int i = 0; i < m; i++) {
			System.out.println(hs.get(b[i]));
		}
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值