[2007年NOIP普及组] 奖学金
试题分析:本题目有三个要求,1.总分高的在前面,2.总分相同,语文成绩高的在前面,3.总分,语文成绩相同,学号小的在前面,适合用结构体
算法分析:设置结构体,用快排排序,先比较总分,再试语文,最后按学号比较
#include<bits/stdc++.h>
using namespace std;
struct xx{
int yw;
int zf;
int xh;
}xx[500];
int bj,flag;
void kp(int l,int r){
bj=(l+r)/2;
int mid=xx[(l+r)/2].zf;
int midd=xx[(l+r)/2].yw;
int middd=xx[(l+r)/2].xh;
int ll=l;
int rr=r;
while(ll<rr){
flag=0;
while(ll!=rr){
if(xx[ll].zf>mid){
break;
}
if(xx[ll].zf==mid&&xx[ll].yw>midd){
break;
}
if(xx[ll].zf==mid&&xx[ll].yw==midd&&xx[ll].xh<middd){
break;
}
if(xx[ll].zf==mid&&xx[ll].yw==midd&&xx[ll].xh==middd){
flag=1;
bj=ll;
break;
}
ll++;
}
while(ll!=rr){
if(xx[rr].zf<mid){
break;
}
if(xx[rr].zf==mid&&xx[rr].yw<midd){
break;
}
if(xx[rr].zf==mid&&xx[rr].yw==midd&&xx[rr].xh>middd){
break;
}
if(xx[rr].zf==mid&&xx[rr].yw==midd&&xx[rr].xh==middd){
flag=2;
bj=rr;
break;
}
rr--;
}
if(ll==rr){
xx[bj].xh=xx[ll].xh;
xx[bj].yw=xx[ll].yw;
xx[bj].zf=xx[ll].zf;
xx[ll].xh=middd;
xx[ll].yw=midd;
xx[ll].zf=mid;
rr--;
ll++;
break;
}
if(flag==1){
bj=rr;
}
if(flag==2){
bj=ll;
}
int t=xx[rr].zf;
xx[rr].zf=xx[ll].zf;
xx[ll].zf=t;
t=xx[rr].xh;
xx[rr].xh=xx[ll].xh;
xx[ll].xh=t;
t=xx[rr].yw;
xx[rr].yw=xx[ll].yw;
xx[ll].yw=t;
}
if(rr>l) kp(l,rr);
if(ll<r) kp(ll,r);
}
int main(){
int n,i,j,c,d,w;
cin>>n;
for(i=1;i<=n;i++){
cin>>xx[i].yw>>c>>d;
xx[i].xh=i;
xx[i].zf=xx[i].yw+c+d;
}
kp(1,n);
for(i=n;i>n-5;i--){
cout<<xx[i].xh<<" "<<xx[i].zf<<endl;
}
}
浙公网安备 33010602011771号