GPLT团体程序设计天梯赛 L1-088 静静的推荐

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倒序排,可是排完之后仍不好处理。所以,多思考思考。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值