• PAT甲级1080 Graduate Admission【模拟】


    题目https://pintia.cn/problem-sets/994805342720868352/problems/994805387268571136

    题意:

    模拟高考志愿录取。

    考生根据总成绩和高考成绩排名。根据排名往下录取,每个人有k个志愿。

    如果他填的学校名额没有满,那么就可以被录取。如果他填的学校名额满了,最后一名的排名和这个人是一样的话,就可以被录取。

    思路:

    直接模拟。

    刚开始居然有一个数据超时了,把排序的cmp里面改成传引用居然就过了。

     1 //#include<bits/stdc++>
     2 #include<stdio.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<stdlib.h>
     7 #include<queue> 
     8 #include<map>
     9 #include<stack>
    10 #include<set>
    11 
    12 #define LL long long
    13 #define ull unsigned long long
    14 #define inf 0x3f3f3f3f 
    15 
    16 using namespace std;
    17 
    18 int n, m, k;
    19 const int maxn = 4e4 + 5;
    20 struct student{
    21     int ge, gi;
    22     int id; 
    23     int gfinal;
    24     vector<int>apply;
    25 }stu[maxn];
    26 
    27 bool cmp(student &a, student &b)
    28 {
    29     if(a.gfinal == b.gfinal){
    30         return a.ge > b.ge;
    31     }
    32     else return a.gfinal > b.gfinal;
    33 }
    34 
    35 struct school{
    36     int quota;
    37     vector<student>addmit;
    38 }sch[105]; 
    39 
    40 bool cmpans(student &a, student &b)
    41 {
    42     return a.id < b.id;
    43 }
    44 
    45 
    46 int main()
    47 {
    48     scanf("%d%d%d", &n, &m, &k);
    49     for(int i = 0; i < m; i++){
    50         scanf("%d", &sch[i].quota);
    51     }
    52     for(int i = 0; i < n; i++){
    53         stu[i].id = i;
    54         scanf("%d%d%", &stu[i].ge, &stu[i].gi);
    55         stu[i].gfinal = (stu[i].ge + stu[i].gi) / 2;
    56         for(int j = 0; j < k; j++){
    57             int s;
    58             scanf("%d", &s);
    59             stu[i].apply.push_back(s);
    60         }
    61     }
    62     sort(stu, stu + n, cmp);
    63     
    64     for(int i = 0; i < n; i++){
    65         for(int j = 0; j < k; j++){
    66             int s = stu[i].apply[j];
    67             if(sch[s].quota){
    68                 sch[s].addmit.push_back(stu[i]);
    69                 sch[s].quota--;
    70                 break;
    71             }
    72             else{
    73                 if(sch[s].addmit.size()){
    74                     student lastone = sch[s].addmit.back();
    75                     if(lastone.gfinal == stu[i].gfinal && lastone.ge == stu[i].ge){
    76                         sch[s].addmit.push_back(stu[i]);
    77                         break;
    78                     }
    79                 }
    80             }
    81         }
    82     }
    83     
    84     for(int i = 0; i < m; i++){
    85         if(sch[i].addmit.size()){
    86             sort(sch[i].addmit.begin(), sch[i].addmit.end(), cmpans);
    87             printf("%d", sch[i].addmit[0].id);
    88             for(int j = 1; j < sch[i].addmit.size(); j++){
    89                 printf(" %d", sch[i].addmit[j].id);
    90             }    
    91         }
    92         printf("
    ");
    93     }
    94     
    95     
    96     return 0;    
    97 } 
  • 相关阅读:
    VS2010 C++环境下DLL和LIB文件目录及名称修改
    什么是lib文件,lib和dll的关系如何
    C++静态库与动态库
    OpenSUSE安装软件
    写给已有编程经验的 Python 初学者的总结
    安装pydiction
    yii webservice 提示:Procedure 'getSent' not present 错误的解决方法(转)
    C# 子线程与主线程通讯方法一
    C#操作Access时Parameters集合的使用方法(转)
    [导航教程] [C#基类库大全]官方产品发布与源码下载---苏飞版
  • 原文地址:https://www.cnblogs.com/wyboooo/p/10477352.html
Copyright © 2020-2023  润新知