坑点
测试点1、2
对每排只有一个人与所有的人都在同一排这两种情况要特殊处理
实现
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct man {
string name;
int high;
};
bool cmp(man m1, man m2)
{
return m1.high == m2.high ? m1.name < m2.name : m1.high > m2.high;
}
int main()
{
int n, k,i,row,everyrow,mid;
cin >> n >> k;
row = k; //用来遍历行
vector<man> men(n);
for (i = 0; i < n; i++)
{
cin >> men[i].name >> men[i].high;
}
sort(men.begin(), men.end(), cmp);
i = 0;
int currentmidIndex = 0, currentstart=0; //每行中间最大值的下标、每行需要打印的第一个值的下标
while (row)
{
int count = 1; //统计当前行打印的个数
everyrow = row == k ? (n-n / k*(k-1) ) : (n / k); //最后一行与其他行所包含的个数
mid = everyrow / 2 + 1; //中间位置1 2 3...
if(mid>1) //这一行的个数多于1
currentstart = (currentmidIndex + (mid - 1) * 2 - 1);
if (mid == 1) //这一行只有一个元素
currentstart = row==k?0:currentstart+1; //第一行即最后一排是从0开始
i = currentstart;
for (count; count <= everyrow; count++)
{
if (count == everyrow)
cout << men[i].name << endl;
if (count < everyrow)
{
cout << men[i].name << " ";
if (count < mid - 1) //中间位置左边的下标变化
i -= 2;
else if (count == mid - 1) //紧邻中间位置的两个元素的下标变化
i--;
else //右边
i += 2;
}
}
currentmidIndex += everyrow;
row--;
}
return 0;
}