1080. Graduate Admission (30)-排序

先对学生们进行排序,并且求出对应排名。

对于每一个学生,按照志愿的顺序:

1.如果学校名额没满,那么便被该学校录取,并且另vis[s][app[i].ranks]=1,表示学校s录取了该排名位置的学生。

2.如果该学校名额已满,那么看看vis[s][app[i].ranks]是否为1,若是,则表明学校有录取过和他排名一样的学生,那么该学生也能被录取。

否则,学生未录取。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>

using namespace std;
const int maxn=40005;
const int maxschool=105;
int quota[maxschool];
vector<int> res[maxschool];
int app_school[maxn];
int vis[maxschool][maxn]; //vis[s][i]=1表示学校s有录取rank为i的学生
struct Applicant{
    int id;
    int ranks;
    int GE,GI;
    float grades;
    int choose[5];
    bool operator<(const Applicant tmp)const{
        if(grades==tmp.grades){
            return GE>tmp.GE;
        }
        else
            return grades>tmp.grades;
    }
}app[maxn];

int main()
{
    int n,m,k;
    scanf("%d %d %d",&n,&m,&k);
    for(int i=0;i<m;i++){
        scanf("%d",&quota[i]);
    }
    for(int i=0;i<n;i++){
        scanf("%d %d",&app[i].GE,&app[i].GI);
        for(int j=0;j<k;j++){
            scanf("%d",&app[i].choose[j]);
        }
        app[i].id=i;
        app[i].grades=(app[i].GE+app[i].GI)/2.0f;
    }
    sort(app,app+n);
    int cnt=0;
    for(int i=0;i<n;i++){
        app[i].ranks=++cnt;
        for(int j=i+1;j<n;j++){
            if(app[i].grades==app[j].grades && app[i].GE==app[j].GE){
                app[j].ranks=cnt;
                i++;
            }
        }
    }

//for(int i=0;i<n;i++){
//    printf("ranks:%d %d %f %d\n",app[i].GE,app[i].GI,app[i].grades,app[i].ranks);
//}
    memset(vis,0,sizeof(vis));
    int lastSchool=0;
    int last=0;
    for(int i=0;i<n;i++){
        app_school[i]=-1;
        int j;
        for(j=0;j<k;j++){
            int s=app[i].choose[j];
            if(quota[s]>0){
                quota[s]--;
                res[s].push_back(app[i].id);
                //lastSchool=s;
                //last=i;
                app_school[i]=s;
//printf("app:%d school:%d\n",app[i].id,s);
                vis[s][app[i].ranks]=1;
                break;
            }
            else{
                //只要有rank一样的选了这所学校,即使没有名额,那么该生也可以被录取
                if(vis[s][app[i].ranks]){
                    app_school[i]=s;
                    res[s].push_back(app[i].id);
                    break;
                }
            }
        }
    }
    for(int i=0;i<m;i++){
        int num=res[i].size();
        if(num==0)
            printf("\n");
        else{
            sort(res[i].begin(),res[i].end());
            printf("%d",res[i][0]);
            for(int j=1;j<num;j++){
                printf(" %d",res[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
View Code

 

posted @ 2017-02-11 22:36  辰曦~文若  阅读(224)  评论(0编辑  收藏  举报