1080 Graduate Admission (30 分)

一道排序问题;
坑点如下
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");
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值