题解:P1068 [NOIP2009 普及组] 分数线划定

· · 题解

题意

让我们输出分数线及按从大到小的顺序输出录取的所有人的考号和分数。

思路

我们用一个结构体来存储每个人的考号和分数,按从大到小的顺序对分数进行排序,在分数相同的情况下,考号小的就排在前面,因为题目说成绩相同,则按报名号由小到大的顺序输出,然后算出分数线,从最后一个人开始,找出第一个大于等于分数线的就停止,记录下当前下标 i ,就有 i 个人被录取,然后输出录取的所有人的考号和分数。

code:

#include<bits/stdc++.h>
using namespace std;
struct Scoreline{
    int k,s;
}a[5010]; //k 代表考号,s 代表分数
int n,m,j; //j 来记录第一个大于等于分数线的下标
bool cmp(Scoreline a,Scoreline b){
    if(a.s!=b.s) return a.s>b.s;
    return a.k<b.k;
} //排序函数
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i].k>>a[i].s; //输入
    sort(a+1,a+n+1,cmp); //排序
    int x=a[int(m*1.5)].s; //注意向下取整,int 会自动向下取整
    cout<<x<<' '; //输出分数线
    for(int i=n;i>=1;i--){
        if(a[i].s>=x){
            j=i;
            break; //注意 break,不然会出错
        }
    }
    cout<<j<<endl; //输出被录取的人数
    for(int i=1;i<=j;i++) cout<<a[i].k<<' '<<a[i].s<<endl; //依次输出被录取的人的考号及分数
    return 0;
} //点赞评论再走吧,管理员求过QWQ

AC记录

完结撒花!!!