[2009年NOIP普及组] 分数线划定
算法分析:因为要根据分数排名,所以先用快排排序,再根据m*1.5(因为会默认向下取整,不用管)的人,求出录取线,再找不低于录取线的人,求出总人数,for循环输出录取的人
#include<bits/stdc++.h>
using namespace std;
struct a{
int xh;
int fs;
}a[600000];
void kp(int l,int r){
int mid=a[l].fs;
int midd=a[l].xh;
int ll=l;
int rr=r;
while(ll<rr){
while(ll<rr&&a[rr].fs<=mid){
if(a[rr].fs==mid&&a[rr].xh<=midd){
break;
}
rr--;
}
a[ll].fs=a[rr].fs;
a[ll].xh=a[rr].xh;
while(ll<rr&&a[ll].fs>=mid){
if(a[ll].fs==mid&&a[ll].xh>=midd){
break;
}
ll++;
}
a[rr].fs=a[ll].fs;
a[rr].xh=a[ll].xh;
}
if(ll==rr){
a[ll].fs=mid;
a[ll].xh=midd;
ll++;
rr--;
}
if(rr>l) kp(l,rr);
if(ll<r) kp(ll,r);
}
int main(){
int n,m,i,j,s=0;
cin>>n>>m;
for(i=1;i<=n;i++){
cin>>a[i].xh>>a[i].fs;
}
kp(1,n);
m=m*1.5;
for(i=1;i<=n;i++){
if(a[i].fs>=a[m].fs){
s++;
}
else{
break;
}
}
cout<<a[m].fs<<" "<<s<<endl;
for(i=1;i<=s;i++){
cout<<a[i].xh<<" "<<a[i].fs;
if(i!=s) cout<<endl;
}
}