一道排序问题;
坑点如下
1,结构体的开法,我只开了考生,后来看有人的代码是另开了学校的结构体;
2,排序函数的的用法sort(U[i].begin(),U[i].end(),cmp1);其中U为vector容器,比较函数如下
bool cmp1(int a,int b){
return a<b;
}
3,考生rank的排行算法如下
for(int i=0;i<n;i++){
if(i>0&&student[i].grade==student[i-1].grade&&student[i].GE==student[i-1].GE)
{ student[i].R=student[i-1].R;}
else
{ student[i].R=i;}
}
4,对于rank相同的考生要看是否被破格录入同一所大学
———————————————————————————————
整体代码如下
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int maxn=40050;
struct node{
double GE,GI;
double grade;
int number;
int p[10];
int R;
}student[maxn];
int Umax[110];
vector<int>U[110];
bool cmp(node a,node b){
if(a.grade!=b.grade)
{ return a.grade>b.grade;}
else
{return a.GE>b.GE;}
}
bool cmp1(int a,int b){
return a<b;
}
int main(){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++){
scanf("%d",&Umax[i]);}
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&student[i].GE,&student[i].GI);
student[i].grade=student[i].GE+student[i].GI;
student[i].number=i;
for(int l=0;l<k;l++){
scanf("%d",&student[i].p[l]); }
}
sort(student,student+n+1,cmp);
for(int i=0;i<n;i++){
if(i>0&&student[i].grade==student[i-1].grade&&student[i].GE==student[i-1].GE)
{ student[i].R=student[i-1].R;}
else
{ student[i].R=i;}
}
U[student[0].p[0]].push_back(student[0].number);
Umax[student[0].p[0]]--;
int shang=student[0].p[0];
for(int i=1;i<n;i++){
if(student[i].R==student[i-1].R)
{ for(int l=0;l<k;l++)
{ if(Umax[student[i].p[l]]>0)
{ U[student[i].p[l]].push_back(student[i].number);
Umax[student[i].p[l]]--;
shang=student[i].p[l];
break;
}
else if(Umax[student[i].p[l]]==0&&student[i].p[l]==shang)
{ U[student[i].p[l]].push_back(student[i].number);
break;
}
}}
else
{ for(int l=0;l<k;l++)
{ if(Umax[student[i].p[l]]>0)
{ U[student[i].p[l]].push_back(student[i].number);
Umax[student[i].p[l]]--;
shang=student[i].p[l];
break;
}}
}
}
for(int i=0;i<m;i++){
int len1=U[i].size();
sort(U[i].begin(),U[i].end(),cmp1);
for(int l=0;l<len1;l++){
printf("%d",U[i][l]);
if(l!=len1-1){printf(" ");}
}
printf("\n");
}
}