码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-11-11 23:04:37      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:ssi   miss   包括   测试   sort   换行   false   计划   trick   

题意:

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

trick:

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

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

代码:

#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
typedef struct student{
int x,y;
int id;
int c[7];
};
student d[40007];
int a[107];
int b[7];
vector<int>ans[107];
bool cmp(student a,student b){
if(a.x+a.y!=b.x+b.y)
return a.x+a.y>b.x+b.y;
return a.x>b.x;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<m;++i)
cin>>a[i];
for(int i=0;i<n;++i){
cin>>d[i].x>>d[i].y;
for(int j=1;j<=k;++j)
cin>>d[i].c[j];
d[i].id=i;
}
sort(d,d+n,cmp);
int tamp=-1;
for(int i=0;i<n;++i){
if(i>0&&d[i].x+d[i].y<d[i-1].x+d[i-1].y)
tamp=-1;
for(int j=1;j<=k;++j){
if(a[d[i].c[j]]){
--a[d[i].c[j]];
ans[d[i].c[j]].push_back(d[i].id);
tamp=d[i].c[j];
break;
}
else if(d[i].c[j]==tamp&&d[i].y==d[i-1].y&&d[i].x==d[i-1].x){
ans[tamp].push_back(d[i].id);
break;
}
}
}
for(int i=0;i<m;++i)
sort(ans[i].begin(),ans[i].end());
for(int i=0;i<m;++i){
for(int j=0;j<ans[i].size();++j){
if(j>0)
cout<<" ";
cout<<ans[i][j];
}
cout<<"\n";
}
return 0;
}

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

标签:ssi   miss   包括   测试   sort   换行   false   计划   trick   

原文地址:https://www.cnblogs.com/ldudxy/p/11839051.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!