PAT 甲级 A1080 (2019/02/18)

#include<cstdio>
#include<algorithm>
using namespace std;
struct Student{
    int GE, GI, SUM;            //初试分,面试分,总分
    int rank, stuID;            //名次, 考生id
    int cho[6];                 //志愿
}stu[40010];
struct School{
    int quota;      //招生人数
    int stuNum;     //实际招生人数
    int ID[40010];  //招收学生的编号
    int lastAdmit;  //记录最后一个招收的考生
}sch[101];
bool stucmp(Student a, Student b){
    if(a.SUM != b.SUM) return a.SUM > b.SUM;    //按照总分从大到小排序
    else return a.GE > b.GE;        //按照初试成绩从大到小排序
}
bool IDcmp(int a, int b){
    return stu[a].stuID < stu[b].stuID;//按照考生id从小到大排序
}
int main(){
    int n, k, m;
    scanf("%d%d%d", &n, &m, &k);
    //初始化
    for(int i = 0; i < m; i++){
        scanf("%d", &sch[i].quota);//计划录取人数
        sch[i].stuNum = 0;  //实际录取人数为0
        sch[i].lastAdmit = -1;  //最后一个录取的考生的id为-1
    }
    //依次输入n个学生的信息
    for(int i = 0; i < n; i++){
        stu[i].stuID = i;   //考生编号为i
        scanf("%d%d", &stu[i].GE, &stu[i].GI);  //输入初试,面试成绩
        stu[i].SUM = stu[i].GE + stu[i].GI;     //计算总分
        for(int j = 0; j < k; j++){
            scanf("%d", &stu[i].cho[j]);        //志愿1,2,3...
        }
    }
    sort(stu, stu + n, stucmp);
    //计算每个考生的排名
    for(int i = 0; i < n; i++){
        //计算每个考生的排名
        if(i > 0 && stu[i].SUM == stu[i-1].SUM && stu[i].GE == stu[i-1].GE){
            stu[i].rank = stu[i-1].rank;
        }else{
            stu[i].rank = i;
        }
    }
    //学校录取
    for(int i = 0; i < n; i++){                 //n个考生
        for(int j = 0; j < k; j++){             //每个考生 K 个志愿
            int stuijcho = stu[i].cho[j];       //考生i的第j志愿(为学校编号)
            int num = sch[stuijcho].stuNum;     //学校stuijcho的当前录取人数
            int last = sch[stuijcho].lastAdmit; //选择学校最后一位录取的考生编号
            if(num < sch[stuijcho].quota || (last != -1 && stu[i].rank ==stu[last].rank)){
                sch[stuijcho].ID[num] = i;      //录取该考生
                sch[stuijcho].lastAdmit = i;    //该学校录取的最后一位考生变为i
                sch[stuijcho].stuNum++;         //当前招生人数加1
                break;
            }
        }
    }
    //对学校
    for(int i = 0; i < m; i++){
        if(sch[i].stuNum > 0){  //如果招到考生
            //按照id排序
            sort(sch[i].ID, sch[i].ID + sch[i].stuNum, IDcmp);
            for(int j = 0; j < sch[i].stuNum; j++){
                printf("%d", stu[sch[i].ID[j]].stuID);
                if(j < sch[i].stuNum - 1){
                    printf(" ");
                }
            }
        }
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zjsaipplp/p/10425245.html

时间: 2024-09-29 23:17:56

PAT 甲级 A1080 (2019/02/18)的相关文章

PAT 甲级 A1092 (2019/02/18)

#include<cstdio> #include<cstring> int change(char ch){ if(ch >= '0' && ch <= '9') return ch - '0'; if(ch >= 'a' && ch <= 'z') return ch - 'a' + 10; if(ch >= 'A' && ch <= 'Z') return ch - 'A' + 36; } i

PAT 甲级 A1084 (2019/02/18)

#include<cstdio> #include<cstring> int main(){ char str1[101], str2[101]; bool HashTable[128] = {false}; scanf("%s", str1); scanf("%s", str2); int len1 = strlen(str1); int len2 = strlen(str2); for(int i = 0; i < len1; i+

PAT 甲级 A1075 (2019/02/18)

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN = 10010; struct PAT_Student{ int id; //考号 int score[6]; //每道题的分数 bool flag; //是否有能通过编译的提交 int all_score; //总分 int prefect_problem;//完美题解数 }stu[MAX

PAT甲级【2019年3月考题】——A1158 TelefraudDetection【25】

Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, unsuspecting victims lose their entire life savings. To stop this crime, you are supposed to write a program to detect those suspects from a huge amount of phone c

PAT甲级——A1080 Graduate Admission

It is said that in 2011, there are about 100 graduate schools ready to proceed over 40,000 applications in Zhejiang Province. It would help a lot if you could write a program to automate the admission procedure. Each applicant will have to provide tw

PAT甲级1005 Spell It Right

题目:PAT甲级 1005 题解:水题.看到题目的第一时间就在想一位一位的mod,最后一加一转换就完事了.结果看到了N最大为10的100的次方,吓得我赶紧放弃这个想法... 发现碰到这种情况用字符串十分好用,这道题应该考察的就是这一点.大致思路就是把数字的每一位放到字符串中,然后通过ASCII码得到每一位的相加结果num,然后把num一位一位的放到stack中,使用stack是因为它先进先出的特性,最后输出就行了. 代码: 1 #include<cstdio> 2 #include<qu

【谜客帝国】第147届月思主擂谜会(2019.02.15)

 [谜客帝国]第147届月思主擂谜会(2019.02.15) 主持计分:东东 1.“人在中天日月间”(9笔字)春/月思 [注:面出陈孚<开平即事二首>,“势超大地山河上,-.”] 2. 玉漏声中烟气袅(3字法国奢侈品牌)YSL/月思 3. 双双相念初相爱(2字著名动漫人物)菜菜/月思 4.“数点燕云州外.雪霜威”(足球用语二,4+3)4132.451/月思 [注:面出余文<相见欢>,“登高望断龙旗,未曾归.几度中原北定,梦依稀.朔风乱,胡尘漫,掩斜晖.-.”] 5.“十载同心如一人

PAT甲级专题|最短路

PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做,只能得20分 #include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 510; int cmax,n,ter,m; int caps[maxn]; int g[maxn][m

PAT甲级考前整理

终于在考前,刷完PAT甲级130道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种境界.PAT甲级题目总的说卡题目的比较多,卡测试点的比较少,有些题目还会有题意混淆,这点就不吐槽了吧.静下心来耍这130道题,其实磨练的是一种态度与手感,养成的是一种习惯.热爱AC没有错!! 130道题目主要的考点: 1.排序:快速排序,直接插入排序,希尔排序,分治排序,堆排序. 2.图论:拓扑排序.最短路径.深度搜索.广度搜索. 3.树:树的遍历.完全二叉树.AVL. 4.其他:并查集,模拟,哈希.背包.