题目解析
给定n组名单 求出满足条件的人数
解题思路
题目条件为:
- 天梯赛分数不低于 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表达式 也觉得是是释放双手的一个东东,它可以将参数里面的数进行表达式运算再传出答案 )求个数
