L1-088 静静的推荐
分数 20
全屏浏览题目
切换布局
作者 陈越
单位 浙江大学
天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:
- 只考虑得分不低于 175 分的学生;
- 一共接受 K 批次的推荐名单;
- 同一批推荐名单上的学生的成绩原则上应严格递增;
- 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。
给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?
输入格式:
输入第一行给出 3 个正整数:N(≤105)为参赛学生人数,K(≤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 人进入推荐名单。
最主要的是这两条规则
- 同一批推荐名单上的学生的成绩原则上应严格递增;
- 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。
最重要的是把这个题的题意理解清楚之后,把这个题的本质搞明白,那这个题就不复杂了。
现在的情况就是,利用最后一条规则,在每批名单中,尽可能地多推荐学生,根本上每批只能多推荐一个学生,此学生得分大于等于175,且PAT成绩不合格的,将他放在他的分数的那一列的第一个,后续可以跟随无数个分数和他一样,且PAT成绩合格的,这样就可以达到每次推荐学生的时候多推荐一个,且只能多推荐一个。
因为推荐批次K是一个正整数,则一定大于等于1,所以其实在第一次推荐时,就可以利用最后一条规则,把所有得分合格且PAT合格的学生都推荐上去,而推荐K次,就最多有K个得分合格且PAT不合格的学生被推荐上去。
AC代码
#include<iostream>
using namespace std;
struct P
{
int score;
int pat;
};
int main()
{
int n,k,s;
cin>>n>>k>>s; //人数,推荐批次,pat面试分数线。
int arr[300] = {0};
int show = 0;
while(n--)
{
P p;
cin >> p.score >> p.pat;
if(p.score>=175&&p.pat>=s)
++show;
else if(p.score>=175&&p.pat<s)
arr[p.score]++;
}
for(int i = 290; i >= 175; --i)
{
if(arr[i]>=k)
show+=k;
else
show+=arr[i];
}
cout<<show;
return 0;
}
其实大多时候还是要看对题题意的理解程度的,像上面这个题,如果没有把尽可能多推荐学生的方法的本质弄清楚,就很难搞了,最开始有过排序的念头,得分正序,PAT倒序排,可是排完之后仍不好处理。所以,多思考思考。