题解:P1068 [NOIP2009 普及组] 分数线划定
wanghonghui123 · · 题解
思路
可以用结构体来做。
-
如果相比的两个数的成绩不同,就按成绩来从大到小排序。否则就按报名号来从小到大排序。
-
分数线是第
1.5m 名选手的成绩,然后再去成绩中去统计大于等于分数线的人数。 -
最后再按照进入面试的选手,分别输出报名号和成绩。
排序关键代码:
bool cmp(stu a,stu b){
if(a.s!=b.s){
return a.s>b.s;
}else{
return a.k<b.k;
}
}
代码
#include <bits/stdc++.h>
using namespace std;
struct stu{
int k,s;
}a[5005];
bool cmp(stu a,stu b){
if(a.s!=b.s){
return a.s>b.s;
}else{
return a.k<b.k;
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i].k>>a[i].s;
}
sort(a+1,a+1+n,cmp);
int t=m*1.5;
int cnt=a[t].s;
int sum=0;
for(int i=1;i<=n;i++){
if(a[i].s>=cnt){
sum++;
}
}
cout<<cnt<<' '<<sum<<endl;
for(int i=1;i<=sum;i++){
cout<<a[i].k<<' '<<a[i].s<<endl;
}
return 0;
}