1. 程式人生 > >PAT (Advanced Level) Practice 1080 Graduate Admission (30 分)

PAT (Advanced Level) Practice 1080 Graduate Admission (30 分)

1.總分大的排前
2.Ge大的排前
3.總分和Ge相同時,排名相同
4.根據志願順序一個個錄取
5.志願學校招生名額滿時,如果和他排名相同的人進了該學校,那麼他也能被錄取

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

const int N=40000+5;
const int M=100+5;

struct Student
{
    int ge,gi,op[6],id;
    bool operator<(const Student s)
const { if(ge+gi!=s.ge+s.gi) return ge+gi>s.ge+s.gi; return ge>s.ge; } }stu[N]; int quota[M],choose[N]; vector<int> G[M]; int same(int x,int y) { return stu[x].ge+stu[x].gi==stu[y].ge+stu[y].gi&&stu[x].ge==stu[y].ge; } 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++) { stu[i].id=i; scanf("%d%d",&stu[i].ge,&stu[i].gi); for(int j=0;j<k;j++) scanf("%d",&stu[i].op[j]); } sort(stu,stu+n); for
(int i=0;i<n;i++) { int f=0; for(int j=0;j<k;j++) { if(quota[stu[i].op[j]]>0) { f=1,choose[i]=stu[i].op[j],quota[choose[i]]--; break; } else { for(int k=i-1;k>=0;k--) { if(same(k,i)&&stu[i].op[j]==choose[k]) { f=1,choose[i]=stu[i].op[j],quota[choose[i]]--; break; } } if(f) break; } } if(!f) choose[i]=-1; } for(int i=0;i<n;i++) if(choose[i]!=-1) G[choose[i]].push_back(stu[i].id); for(int i=0;i<m;i++) sort(G[i].begin(),G[i].end()); for(int i=0;i<m;i++) { for(int j=0;j<G[i].size();j++) { if(j!=0) printf(" "); printf("%d",G[i][j]); } puts(""); } return 0; }