PATA习题1080
题目思路
我在这道题里用了两个结构体学生和学校,在学校中记录了录取名单和之前录取的最低分数,最低分数用来记录等分录取(也可以通过对学生数组排序编号来实现)。
编译改进
第一次我用了可编程数组,发现在测试点会有段错误,后来将两个结构体数组在外面定义了就好了。还有一个疑问是在输出时我之前加了
if(i<m-1)
printf("\n");
会在一个测试点出现格式错误,删除后便通过了,不知道原因是什么。
参考代码
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct{
int ge;
int gi;
int total;
int z[5];
int w;
}stu ;
typedef struct{
int ming;
int zs[40000];
int y=0;
int lastz=-1;
int laste=-1;
}un;
bool cmp(stu s1,stu s2);
stu s[40001];
un u[110];
int main()
{
int n,m,k,t=0;
cin>>n>>m>>k;
for(int i=0;i<m;i++)
scanf("%d",&u[i].ming);
for(int i=0;i<n;i++)
{
scanf("%d %d",&s[i].ge,&s[i].gi);
for(int j=0;j<k;j++)
{
scanf(" %d",&s[i].z[j]);
}
s[i].total=s[i].ge+s[i].gi;
s[i].w=i;
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)
{
t=s[i].z[j];
if(u[t].y<u[t].ming||(s[i].total==u[t].lastz&&s[i].ge==u[t].laste))
{
u[t].zs[u[t].y]=s[i].w;
u[t].lastz=s[i].total;
u[t].laste=s[i].ge;
u[t].y++;
break;
}
}
}
for(int i=0;i<m;i++)
{
sort(u[i].zs,u[i].zs+u[i].y);
for(int j=0;j<u[i].y;j++)
{
printf("%d",u[i].zs[j]);
if(j<u[i].y-1)
printf(" ");
}
if(i<m)
printf("\n");
}
return 0;
}
bool cmp(stu s1,stu s2)
{
if(s1.total!=s2.total)
return s1.total>s2.total;
else
return s1.ge>s2.ge;
}`