• 【PAT甲级】1080 Graduate Admission (30 分)


    题意:

    输入三个正整数N,M,K(N<=40000,M<=100,K<=5)分别表示学生人数,可供报考学校总数,学生可填志愿总数。接着输入一行M个正整数表示从0到M-1每所学校招生人数,N行数据分别包括两个成绩和K个志愿。输出M行依照平行志愿原则输出每所学校录取的学生序号,如果成绩相同,可以突破计划招生人数。

    trick:

    不是很懂为什么当我输出的时候采用if(i>0)cout<<" ";会导致测试点2和4格式错误。。。。。

    发现最后一行必须要换行。。。

    AAAAAccepted code:

     1 #define HAVE_STRUCT_TIMESPEC
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 typedef struct student{
     5     int x,y;
     6     int id;
     7     int c[7];
     8 };
     9 student d[40007];
    10 int a[107];
    11 int b[7];
    12 vector<int>ans[107];
    13 bool cmp(student a,student b){
    14     if(a.x+a.y!=b.x+b.y)
    15         return a.x+a.y>b.x+b.y;
    16     return a.x>b.x;
    17 }
    18 int main(){
    19     ios::sync_with_stdio(false);
    20     cin.tie(NULL);
    21     cout.tie(NULL);
    22     int n,m,k;
    23     cin>>n>>m>>k;
    24     for(int i=0;i<m;++i)
    25         cin>>a[i];
    26     for(int i=0;i<n;++i){
    27         cin>>d[i].x>>d[i].y;
    28         for(int j=1;j<=k;++j)
    29             cin>>d[i].c[j];
    30         d[i].id=i;
    31     }
    32     sort(d,d+n,cmp);
    33     int tamp=-1;
    34     for(int i=0;i<n;++i){
    35         if(i>0&&d[i].x+d[i].y<d[i-1].x+d[i-1].y)
    36             tamp=-1;
    37         for(int j=1;j<=k;++j){
    38             if(a[d[i].c[j]]){
    39                 --a[d[i].c[j]];
    40                 ans[d[i].c[j]].push_back(d[i].id);
    41                 tamp=d[i].c[j];
    42                 break;
    43             }
    44             else if(d[i].c[j]==tamp&&d[i].y==d[i-1].y&&d[i].x==d[i-1].x){
    45                 ans[tamp].push_back(d[i].id);
    46                 break;
    47             }
    48         }
    49     }
    50     for(int i=0;i<m;++i)
    51         sort(ans[i].begin(),ans[i].end());
    52     for(int j=0;j<ans[0].size();++j){
    53         if(j>0)
    54             cout<<" ";
    55         cout<<ans[0][j];
    56     }
    57     for(int i=1;i<m;++i){
    58         cout<<"
    ";
    59         for(int j=0;j<ans[i].size();++j){
    60             if(j>0)
    61                 cout<<" ";
    62             cout<<ans[i][j];
    63         }
    64     }
    65     cout<<endl;
    66     return 0;
    67 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    少写代码帮你模块化方法 & 运动框架 & 简化轮播图
    JQ
    弹框&可用于判断
    移动端内容区域滚动做法总结
    数组这回事
    Bootstrap & 响应式
    谈谈this对象
    模态框中水平垂直居的问题
    图片的懒加载问题
    js中运动框架的封装
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11839051.html
Copyright © 2020-2023  润新知