• 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
    ",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
    ",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("
    ");
            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("
    ");
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    laravel 表单接收
    Ubuntu查找通过apt命令已安装软件
    Centos7.2源码编译安装LA(N)MP
    文件和目录权限
    第六天 软件安装和管理
    第五天用户和组群账户管理
    第四天 文件和目录操作
    第三天 目录和文件
    第二天 linux命令
    oracle数据库学习第一天
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6390146.html
Copyright © 2020-2023  润新知