天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的: 只考虑得分不低于 175 分的学生; 一共接受 K 批次的推荐名单; 同一批推荐名单上的学生的成绩原则上应严格递增; 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。 给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生? 输入格式: 输入第一行给出 3 个正整数:N(≤10 5 )为参赛学生人数,K(≤5×10 3 )为企业接受的推荐批次,S(≤100)为该企业的 PAT 面试分数线。 随后 N 行,每行给出两个分数,依次为一位学生的天梯赛分数(最高分 290)和 PAT 分数(最高分 100)。 输出格式: 在一行中输出静静姐最多能向企业推荐的学生人数。 输入样例: c语言
时间: 2024-03-11 15:44:50 浏览: 184
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100000
#define MAX_K 5000
struct Student {
int t_score; // 天梯赛分数
int pat_score; // PAT分数
int flag; // 是否达到面试分数线
} students[MAX_N];
int cmp(const void *a, const void *b) {
struct Student *s1 = (struct Student *)a;
struct Student *s2 = (struct Student *)b;
if (s1->t_score != s2->t_score) {
return s1->t_score - s2->t_score;
} else if (s1->pat_score != s2->pat_score) {
return s1->pat_score - s2->pat_score;
} else {
return 0;
}
}
int main() {
int n, k, s;
int i, j, count;
int max_count[MAX_K + 1]; // dp数组
int max_index[MAX_K + 1]; // 记录dp数组中最大值的下标
scanf("%d %d %d", &n, &k, &s);
for (i = 0; i < n; i++) {
scanf("%d %d", &students[i].t_score, &students[i].pat_score);
students[i].flag = (students[i].pat_score >= s) ? 1 : 0;
}
qsort(students, n, sizeof(struct Student), cmp);
count = 0;
for (i = 0; i < n; i++) {
if (students[i].t_score >= 175) {
count++;
}
}
for (i = 1; i <= k; i++) {
max_count[i] = 0;
max_index[i] = 0;
}
for (i = 0; i < n; i++) {
if (students[i].t_score < 175) {
continue;
}
for (j = k; j >= 1; j--) {
if (students[i].flag == 1 && students[i].t_score >= max_index[j] && max_count[j - 1] + 1 > max_count[j]) {
max_count[j] = max_count[j - 1] + 1;
max_index[j] = students[i].t_score;
} else if (students[i].t_score > max_index[j] && max_count[j - 1] + 1 > max_count[j]) {
max_count[j] = max_count[j - 1] + 1;
max_index[j] = students[i].t_score;
}
}
}
printf("%d\n", max_count[k]);
return 0;
}
```
其中,`struct Student` 表示学生的天梯赛分数、PAT分数和是否达到面试分数线。程序先读入参赛学生的信息,然后按照要求排序,统计得分不低于 175 分的学生人数。接下来,使用动态规划求解最多能向企业推荐的学生人数。`max_count` 数组表示前i个学生中选j个并且最后一个学生的天梯赛分数为xi时的最大选取数,`max_index` 数组表示对应的最后一个学生的天梯赛分数。对于每个学生,从后往前遍历`max_count` 数组,更新最大值和最后一个学生的天梯赛分数。最后输出`max_count[k]` 即可。
阅读全文