PTA 7-9 毕业照 (25分)(排序)

照毕业照一定要排好队,不然就会有人被挡住,造成终身遗憾。假设有N个毕业生,准备排K行,拍毕业照的摄影师定下这么几条规矩: 1、每一行的人数一定是N/K个,如果有多的同学,全部站最后一排; 2、后排的一定不能比前排任何一个同学矮; 3、在任意一排,个子最高的站中间,之后次高的站他的右边,第三高的站他的左边,第四高的又站右边,这样依次轮换。例如,有5个同学,身高依次是190厘米,188厘米,186厘米,175厘米和170厘米,那么最后应该排成175,188, 190,186, 170。这里我们假设摄影师面向同学们站立,这样摄影师的左手就是同学们的右手。 4、如果身高相同,那就按姓名的字母序的升序排列,我们假定没有重名的。

输入格式:

每个输入包括一个测试用例,第一行有两个正整数N和K,其中N是毕业生总数,K是排数。 N<=10000,K<=10,随后N行,分别给出不超过8个字符的姓名以及他们的身高,姓名中不含空格。

输出格式:

对每一组输入,显示出毕业生拍照时的位置情况,要求打印K行学生的姓名,姓名之间以1个空格分隔,行尾不得有多余空格。因为你是面向毕业生的,所以在最后一排的同学应该显示在第一行,在第一排的同学显示在最后一行。

输入样例:

在这里给出一组输入。例如:

10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159

输出样例:

在这里给出相应的输出。例如:

Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John

解题

  1. 先按题目要求将身高从大到小排好序
  2. 计算好每一列的具体排序情况
    在这里插入图片描述
    代码:
#include <iostream>					//7-9 毕业照 (25分)
#include <algorithm>
#include <vector>
using namespace std;

struct node{
	string name;
	int h;
};

vector<node> v;
bool cmp(node n1, node n2)
{
	if(n1.h == n2.h)
		return n1.name < n2.name;
	return n1.h > n2.h;
}

void ThisSort(int T, int A[])	//T个人占一排	A[i] = j 表示第i个位置占j号
{
	int k = T % 2 ? T - 2 : T - 1;
	for (int i = 0; i < T / 2; i++)
		A[i] = k, k -= 2;
	k = 0;
	for (int i = T / 2; i < T; i++)
		A[i] = k, k += 2;
}

void Print(int A[], int start, int T)
{
	for (int i = 0; i < T; i++)
	{
		if(i)
			cout << " ";
		cout << v[A[i] + start].name;
		//cout << A[i] + start;
	}
	cout << endl;
}

int main()
{
	int N, K;
	cin >> N >> K;
	for (int i = 0; i < N; i++)
	{
		string name;
		int h;
		cin >> name >> h;
		v.push_back({name, h});
	}
	sort(v.begin(), v.end(), cmp);
	int T;
	for (int i = 0; i < v.size(); i += T)
	{
		T = N / K;
		if(!i)
			T += N % K;
		int *A = new int[T];
		ThisSort(T, A);			//按照得到的数组A排序输出
		Print(A, i, T);
		delete[] A;
	}

	system("pause");
	return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值