PAT1055 集体照 (25 分)【3/6通过】

题目

后3个测试点过不去
在这里插入图片描述
在这里插入图片描述

代码

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class Stu
{
public:
	int height = 0;
	string name;
};
class Row
{
public:
	int num;//这排学生人数
	int curSize = 0;
	Stu stu[10000];//这排的学生
};
int sortName(Stu a1, Stu a2)
{
	return a1.name < a2.name;
}
int sortHeight(Stu a1, Stu a2)
{
	return a1.height > a2.height;
}
int main()
{
	Stu stu[10000];
	Row row[10];

	int totalStu;
	int totalRow;

	cin >> totalStu >> totalRow;

	if (totalStu > 5)cout<<"?";//debug

	//输入
	int i;
	for (i = 0; i < totalStu; i++)
	{
		cin >> stu[i].name;
		cin >> stu[i].height;
	}

	//姓名、身高排序
	sort(stu, stu + totalStu, sortName);
	sort(stu, stu + totalStu, sortHeight);

	//分排
	int stuNumOneRow = totalStu / totalRow;
	int stuNumFirstRow = totalStu / totalRow + totalStu % totalRow;
	int j;
	int in = 0;

	int mid;
	int direction;
	for (i = 0; i < totalRow; i++)//第i排
	{
		direction = 1;
		if (i == 0)row[i].num = stuNumFirstRow;//当前排学生总数
		else row[i].num = stuNumOneRow;

		mid = row[i].num / 2;//中间位置
		row[i].stu[mid] = stu[in];//放进中间学生
		in++;
		row[i].curSize++;

		if (row[i].curSize == row[i].num)continue;

		while (1)
		{
			if (mid - direction<0)break;

			row[i].stu[mid - direction] = stu[in];
			in++;
			row[i].curSize++;
			if (row[i].curSize == row[i].num)break;

			row[i].stu[mid + direction] = stu[in];
			in++;
			row[i].curSize++;
			if (row[i].curSize == row[i].num)break;

			direction++;
		}
	}

	//输出
	for (i = 0; i < totalRow; i++)
	{
		for (j = 0; j < row[i].num; j++)
		{
			cout << row[i].stu[j].name;
			if (j != row[i].num - 1)cout << " ";
		}
		cout << endl;
	}

	//cout << endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/88048483
今日推荐