题解 P1068 【分数线划定】
Yumeng_Xue · · 题解
#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(),先按成绩排序,再在各成绩段内按号码排序,直接输出。