PTA-L1-088 静静的推荐(题解)
一、题目
二、思路和代码
思路(依据)
- 对于分数没有达到175的人以下条件都不用考虑
- 对于PAT分数没有达标的人,使用一个数组来映射0~290分的人数,只要该人数没有超过K就还可以增加人数,否则就不能增加了。
- 对于PAT分数达标的人则无需处理,企业会直接录取,所以不用将该人数加入到上面的数组中。
对于2点而言是为了使其满足以下条件
- 一共接受 K 批次的推荐名单;
- 同一批推荐名单上的学生的成绩原则上应严格递增;
对于第3点而言是为了满足如下条件
- 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。
代码
#include<iostream>
using namespace std;
int main() {
int N, K, S; cin >> N >> K >> S;
// mp记录当前0~290分的人数,如果大于了K就不能继续增加
// 原因:1. 同一批推荐名单上的学生的成绩原则上应严格递增
// 2 .一共接受 K 批次的推荐名单
// 所以同一分数的(不含特殊情况(参加过 PAT 考试且且成绩达到了该企业的面试分数线))
// 因为递增,所以不能为同一批且最大批次为K
int cnt = 0, mp[291] = {0};
for(int i=0; i<N; i++) {
int tts, pat; cin >> tts >> pat;
// 1. 只考虑得分不低于 175 分的学生;
if(tts < 175) continue;
if(pat >= S) cnt++;
else if(mp[tts] < K) cnt++, mp[tts]++;
}
cout << cnt << endl;
return 0;
}
三、其他
当时参加比赛时这道题直接卡我一个多小时,为了分数能够高点不得以放弃这道题,回想起来才发现是当时想复杂了,被他的题目描述给误导了,直接陷入了死胡同😔
现在比赛结束回顾这道题时发现网上的代码虽然很简洁但是大多数都没有讲解为什么,为了我下次还能想起所以写了该博客,也是为了拥有同样的烦恼的人提供帮助!