PAT-乙-1055 1055 集体照 (25 分)

在这里插入图片描述
在这里插入图片描述

代码

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

struct Stu{
	string name;
	int height;
};

int compare(Stu a, Stu b){
	if(a.height!=b.height){
		return a.height>b.height;
	}
	else{
		return a.name<b.name;
	}
}

int main() {

	int n, K;
	cin>>n>>K;
	Stu stu[n];
	
	for(int i=0; i<n; i++){
		cin>>stu[i].name>>stu[i].height;
	}
	sort(stu, stu+n, compare);
	
	int remind = n%K;
	int eachRowStuNum = n/K;
	vector<int> v;
	for(int i=0; i<K; i++){
		if(i==0){
			int tmp = remind + eachRowStuNum;
			v.push_back(tmp);
			n -= tmp;
		}
		else{
			v.push_back(eachRowStuNum);
			n -= eachRowStuNum;
		}
	}
	
	int nowPos = 0;
	for(int i=0; i<v.size(); i++){
		int tmp = v.at(i);
		string a[tmp];
		int count = 0;
		// fill the medium
		int media = tmp/2;
		a[media] = stu[nowPos++].name;
		count++;
		while(count<tmp){
			//fill left
			if(count%2){
				a[media-count/2-1] = stu[nowPos++].name;
				count++;
			}
			//fill right
			else{
				a[media+count/2] = stu[nowPos++].name;
				count++;
			}
		}
		cout<<a[0];
		for(int j=1; j<tmp; j++){
			cout<<" "<<a[j];
		}
		cout<<endl;
	}

	return 0;
}

注解

1、先按题目给定条件,降序排列。要会用compare函数对结构体排序,哪些比较条件,相等如何处理。

int compare(Stu a, Stu b){
    	if(a.height!=b.height){
    		return a.height>b.height;
    	}
    	else{
    		return a.name<b.name;
    	}
    }

2、因题目给定了总人数和行数,可求出每一行的人数,依次放入vector中保存。具体代码如下:

		int remind = n%K;
    	int eachRowStuNum = n/K;
    	vector<int> v;
    	for(int i=0; i<K; i++){
    		if(i==0){
    			int tmp = remind + eachRowStuNum;
    			v.push_back(tmp);
    			n -= tmp;
    		}
    		else{
    			v.push_back(eachRowStuNum);
    			n -= eachRowStuNum;
    		}
    	}

3、依次取出vector中的值,和刚才排好序的结构体,按照题目给定条件,每一行中间元素是身高最高的,然后放到左边、右边。依次进行。
定义nowPos是当前轮到的元素序号,tmp是当前行的人数,media是最中间的位置,先填最中间位置,然后依次填两边。用count记录当前行已填的人数,来控制循环的结束。

		int nowPos = 0;
    	for(int i=0; i<v.size(); i++){
    		int tmp = v.at(i);
    		string a[tmp];
    		int count = 0;
    		// fill the medium
    		int media = tmp/2;
    		a[media] = stu[nowPos++].name;
    		count++;
    		while(count<tmp){
    			//fill left
    			if(count%2){
    				a[media-count/2-1] = stu[nowPos++].name;
    				count++;
    			}
    			//fill right
    			else{
    				a[media+count/2] = stu[nowPos++].name;
    				count++;
    			}
    		}

结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值