PAT (Advanced Level) 1080. Graduate Admission (30)
简单题。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<iostream> #include<algorithm> using namespace std; struct X { int id; int ge,gi; int ch[200]; }s[40000+10]; int n,m,k; int sch[200]; vector<int>ans[200]; int le[200],li[200]; bool cmp(const X&a,const X&b) { if(a.ge+a.gi==b.ge+b.gi) return a.ge>b.ge; return a.ge+a.gi>b.ge+b.gi; } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++) scanf("%d",&sch[i]); for(int i=1;i<=n;i++) { s[i].id=i-1; scanf("%d%d",&s[i].ge,&s[i].gi); for(int j=1;j<=k;j++) { scanf("%d",&s[i].ch[j]); s[i].ch[j]++; } } sort(s+1,s+1+n,cmp); for(int i=1;i<=n;i++) { for(int j=1;j<=k;j++) { if(sch[s[i].ch[j]]>0) { sch[s[i].ch[j]]--; ans[s[i].ch[j]].push_back(s[i].id); le[s[i].ch[j]]=s[i].ge; li[s[i].ch[j]]=s[i].gi; break; } if(le[s[i].ch[j]]==s[i].ge&&li[s[i].ch[j]]==s[i].gi) { sch[s[i].ch[j]]--; ans[s[i].ch[j]].push_back(s[i].id); le[s[i].ch[j]]=s[i].ge; li[s[i].ch[j]]=s[i].gi; break; } } } for(int i=1;i<=m;i++) { sort(ans[i].begin(),ans[i].end()); for(int j=0;j<ans[i].size();j++) { printf("%d",ans[i][j]); if(j<ans[i].size()-1) printf(" "); } printf("\n"); } return 0; }