天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:
- 只考虑得分不低于 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 人进入推荐名单。
以下是代码
#include<stdio.h>
enum
{
MG=0, //没过为0
GL=1, //过了为1
};
void shuru(int,int[][2],int) ;
int qiu_tjrs(int zpc,int rs[][2]){
int fs,tjrs=0;
for(fs=0; fs< 290-175+1 ; fs++)
{
// 测试用例 printf("%d %d %d\n",fs+175,rs[fs][GL],rs[fs][MG]);
tjrs+=rs[fs][GL];
tjrs+=(rs[fs][MG]>zpc) ? zpc : rs[fs][MG];
}
return tjrs;
}
//输入次数,分数段的人数,是否参加天梯赛
int main(){
int xsrs,zpc, patfs; //学生人数,总批次 ,PAT分数
scanf("%d %d %d",&xsrs,&zpc,&patfs);
int renshu[290-175+1][2]={ 0 };
//二维数组:得分 PAT参没参加
shuru(xsrs,renshu,patfs); //输入
printf("%d\n",qiu_tjrs(zpc,renshu));
//求_推荐人数 (总批次,人数)
return 0;
}
void shuru(int n, int rs[][2],int s){
//n是输入多少次(参赛学生人数),rs是分段的人数
while(n-->0){
int ttsf,patf; //天梯赛分,PAT分
scanf("%d%d",&ttsf,&patf), ttsf-=175;
if(ttsf <0){
continue;
}
rs[ttsf][patf>=s]++;
}
}
这里解释一下代码:
- 首先,我们定义了两个枚举值
MG
和GL
,分别表示没过和过了。这样,我们可以使用这些标志来记录学生是否通过了 PAT 考试。 shuru
函数用于输入学生的信息。它接受三个参数:n
表示输入多少次(即参赛学生人数),rs
是一个二维数组,用于存储分段的人数,s
表示企业的 PAT 面试分数线。在这个函数中,我们遍历每个学生的信息,将其天梯赛分数减去 175,然后根据 PAT 分数是否达到面试分数线,更新rs
数组中的计数。qiu_tjrs
函数计算推荐人数。它遍历了天梯赛分数的范围(从 175 到 290),累加了满足条件的学生人数。具体计算如下:- 首先,我们累加了通过天梯赛的学生人数。
- 然后,对于每个天梯赛分数,我们还考虑了没有通过天梯赛但通过了 PAT 考试的学生。如果某个学生的天梯赛成绩超过了企业的面试分数线,那么也可以被推荐。我们使用
zpc
(总批次)来限制每个分数段的推荐人数,以确保严格递增的条件。
- 最后,在
main
函数中,我们读取输入,调用shuru
输入学生信息,然后调用qiu_tjrs
计算最终的推荐人数。
这段代码的巧妙之处在于使用了两个数组 renshu
来计数,分别记录天梯赛分数和 PAT 分数的情况。通过遍历分数范围,同时考虑天梯赛分数和 PAT 分数,实现了推荐人数的计算。