题目
后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;
}