题解 P1068 【分数线划定】

· · 题解


#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct stu
{
    int num;
    int grade;
}st[5010];
bool cmpo(const struct stu a,const struct stu b)
{
    return a.grade>b.grade;
}
bool cmpt(const struct stu a,const struct stu b)
{
    return a.num<b.num;
}
int main()
{
    int n,m,f,i,s=1;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;++i)
        scanf("%d %d",&st[i].num,&st[i].grade);
    sort(st+1,st+1+n,cmpo);
    m=m*15/10;
    f=st[m].grade;
    for(i=1;st[i].grade>=f;++i);
    i-=1;
    printf("%d %d\n",f,i);
    for(int j=1;j<=i;++j)
    {
        if(st[j].grade!=st[j+1].grade)
        {
            sort(st+s,st+j+1,cmpt);
            for(int k=s;k<=j;++k)
                printf("%d %d\n",st[k].num,st[k].grade);
            s=j+1;
        }
    }
    sort(st+s,st+i+1,cmpt);
    for(int k=s;k<=m;++k)
                printf("%d %d\n",st[k].num,st[k].grade);
    return 0;
}

充分的发挥了库里sort(),先按成绩排序,再在各成绩段内按号码排序,直接输出。