pta a 1080

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;
}`


发布了27 篇原创文章 · 获赞 0 · 访问量 400

猜你喜欢

转载自blog.csdn.net/zz73zz76/article/details/104173353
PTA