PAT乙级1055

题目链接

坑点

测试点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;
}



猜你喜欢

转载自blog.csdn.net/DoctorLDQ/article/details/86597119