题意
在给定天梯赛分数和pta分数的学生中选择几个批次的学生录取进入公司。
基本选择要求是:1、天梯赛分数必须不小于175分。2、每一批次录取天梯赛分数不小于175的各分数的学生团体中各一人。3、在一个批次中,天梯赛分数相同的,如果pta分数达到了给定的pta分数的可以额外录取。求在限定的录取批次条件下,最大的录取量。(不可重复录取同一学生)
题目输入:学生人数,批次数,pta分数线 和 一些学生的 天梯赛分数 pta分数
思路
首先,排除天梯赛分数小于175的学生。后续只需存储每个天梯赛分数的学生总人数,和每个天梯赛分数下pta分数到达规定的分数的人数。对于pta到达规定分数的学生相当于额外录取,不占录取批次数。
逐个判断每个天梯赛分数总人数减去该天梯赛分数下pta分数到达规定分数的人数后与批次数的大小关系,大于说明该天梯赛分数下pta未达到规定分的人数不能全部录取,只录取批次数学生;小于说明可以该天梯赛分下的学生课全部录取。
Solution
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int>t;
int per_num[400], arrs_num[400]; //per_num存该天梯赛分数下的总人数 arrs_num存该天梯赛分数下pta到达规定分数的人数
for (int i = 0; i < 350; i++) per_num[i] = arrs_num[i] = 0;
int n, k, s, tian, pta;
cin >> n >> k >> s;
for (int i = 0; i < n; i++) {
cin >> tian >> pta;
if (tian >= 175) {
t.insert(tian); //只为去重 只存储天梯赛分数不小于175的学生
per_num[tian]++;
if (pta >= s) arrs_num[tian]++;
}
}
int num = 0;
for (auto x : t) {
if (per_num[x] <= k) num += per_num[x]; //如果总人数都小于批次数直接累加该天梯赛分数下的总人数
else {
num += arrs_num[x]; //累加pta分数达到规定分的人数
if (per_num[x] - arrs_num[x] <= k) num += (per_num[x] - arrs_num[x]); //判断减去pta分数后的人数与批次数的关系
else num += k;
}
}
cout << num << endl;
return 0;
}