题意:
输入三个正整数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 }