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.merge(key, value, remappingFunction)
key - 键
value - 值
remappingFunction - 重新映射函数,用于重新计算值返回值
lambda表达式:( 参数 ) - > 表达式
merge我个人觉得和普通的containsKey()查找相同再存进去一样,不过merge更方便点 第三个 里( 可以 ( 那个我也不确定 ,但是这种形式我觉得是lambda表达式) )放lambda表达式( 而 lambda表达式 也觉得是是释放双手的一个东东,它可以将参数里面的数进行表达式运算再传出答案 )求个数
![](https://i-blog.csdnimg.cn/blog_migrate/aeeb3986387c64306c9964e31fcd48dd.png)
如果有说错的 或者 不懂的 尽管提 嘻嘻
一起进步!!!