L1-088 静静的推荐 - java

L1-088 静静的推荐


Java (javac)
时间限制
1300 ms
内存限制
256 MB

Python (python3)
时间限制
400 ms
内存限制
64 MB

其他编译器
时间限制
200 ms
内存限制
64 MB


题目描述:

天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:

  • 只考虑得分不低于 175 分的学生;
  • 一共接受 K 批次的推荐名单;
  • 同一批推荐名单上的学生的成绩原则上应严格递增;
  • 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。

给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?

输入格式:
输入第一行给出 3 个正整数:N(≤ 1 0 5 10^{5} 105)为参赛学生人数,K(≤ 5 × 1 0 3 5×10^{3} 5×103)为企业接受的推荐批次,S(≤100)为该企业的 PAT 面试分数线。

随后 N 行,每行给出两个分数,依次为一位学生的天梯赛分数(最高分 290)和 PAT 分数(最高分 100)。

输出格式:
在一行中输出静静姐最多能向企业推荐的学生人数。

输入样例:
10 2 90
203 0
169 91
175 88
175 0
175 90
189 0
189 0
189 95
189 89
256 100
输出样例:
8

样例解释:
第一批可以选择 175、189、203、256 这四个分数的学生各一名,此外 175 分 PAT 分数达到 90 分的学生和 189 分 PAT 分数达到 95 分的学生可以额外进入名单。第二批就只剩下 175、189 两个分数的学生各一名可以进入名单了。最终一共 8 人进入推荐名单。


给定n组名单 求出满足条件的人数


emmmmmmm

题目条件为:

  • 天梯赛分数不低于 175 分的学生
  • 一共接受 K 批次的推荐名单

  • PAT 分数达到了该企业的面试分数线直接录用

简单来说
PAT分数达到了该企业的面试分数线 直接录用
PAT分数未达到该企业的面试分数线 且 天梯赛分数不低于 175 分的学生 录用K人


可以有两种写法

统计这个分数段剩下还可以录用多少人 和 统计这个分数段有多少人与K取一个min值


1

import java.io.*;
import java.math.*;
import java.util.*;

public class Main
{

	public static void main(String[] args)
	{
		int n = sc.nextInt(), k = sc.nextInt(), s = sc.nextInt();

//		存储该分段剩下可招的人数
		TreeMap<Integer, Integer> res = new TreeMap<Integer, Integer>();

//		招的人数
		int ans = 0;
		while (n-- > 0)
		{
			int a = sc.nextInt(), b = sc.nextInt();

//			如果天梯赛分数 小于 175 就不会考虑
			if (a < 175)
				continue;

//			如果PAT 分数大于等于该企业的 PAT 面试分数线 直接录取
			if (b >= s)
			{
				ans++;
				continue;
			}

//			如果还未招该分段的人就最多招来k人
			if (!res.containsKey(a))
			{
//				剩下的剩下为 k - 1
				res.put(a, k - 1);

//				人数增加
				ans++;
			}
//			不然就是已经招了该分段的人
			else
			{
//				如果当前分段剩下可招的人数 > 0 那么就表示这个分段还可以招人
				if (res.get(a) > 0)
				{
//					该分段可招的剩下人数 - 1
					res.merge(a, -1, Integer::sum);

//					人数增加
					ans++;
				}
			}
		}
		out.println(ans);

		out.flush();
		out.close();
	}

	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(System.out);
}


2

import java.io.*;
import java.math.*;
import java.util.*;

public class Main
{

	public static void main(String[] args)
	{
		int n = sc.nextInt(), k = sc.nextInt(), s = sc.nextInt();

//		存储该分段未被直接招的人数
		TreeMap<Integer, Integer> res = new TreeMap<Integer, Integer>();

//		招的人数
		int ans = 0;
		while (n-- > 0)
		{
			int a = sc.nextInt(), b = sc.nextInt();

//			如果天梯赛分数 小于 175 就不会考虑
			if (a < 175)
				continue;

//			如果PAT 分数大于等于该企业的 PAT 面试分数线 直接录取
			if (b >= s)
				ans++;
			else
				res.merge(a, 1, Integer::sum);
		}

		for (int i : res.keySet())
			ans += Math.min(res.get(i), k);

		out.println(ans);

		out.flush();
		out.close();
	}

	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(System.out);
}


TreeMap
TreeMap

merge
merge
merge

treemap.merge(key, value, remappingFunction)
key - 键
value - 值
remappingFunction - 重新映射函数,用于重新计算值返回值

lambda表达式:( 参数 ) - > 表达式

merge我个人觉得和普通的containsKey()查找相同再存进去一样,不过merge更方便点 第三个 里( 可以 ( 那个我也不确定 ,但是这种形式我觉得是lambda表达式) )放lambda表达式( 而 lambda表达式 也觉得是是释放双手的一个东东,它可以将参数里面的数进行表达式运算再传出答案 )求个数


如果有说错的 或者 不懂的 尽管提 嘻嘻

一起进步!!!


闪现

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谢谢 啊sir

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

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

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

打赏作者

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

抵扣说明:

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

余额充值