A1109Group Photo (25分)(逻辑题)

一、技术总结

  1. 首先题目的意思是,要给一群人拍照,然后要选取好位置,给n个人,排成k行,然后每行人数为n/k,最后一排人数为n-n/k*(k-1)。然后人是身高从高到低排,如果身高一样就按字母顺序从后往前排,在同一行中,最高的在中间位置,然后再左边一个次高的再右边一个第三高的,这样排好这一排,具体理解看题中例子。
  2. 我们首先使用一个结构体将数据存储起来,string类型存储名字,int存储身高。用vector存储,使用cmp函数排序。
  3. 最后使用一个ans存储每一行的需要输出的结果,在放入的时候需要注意。左右两边分别放,跳两个数存一次,具体参考代码。

二、参考代码

#include<bits/stdc++.h>
using namespace std;
struct node{
	int height;
	string name;
}; 
int cmp(struct node a, struct node b){
	return a.height != b.height ? a.height > b.height : a.name < b.name;
}
int main(){
	int n, k, m;
	cin >> n >> k;
	vector<node> stu(n);
	for(int i  = 0; i < n; i++){
		cin >> stu[i].name;
		cin >> stu[i].height;
	}
	sort(stu.begin(), stu.end(), cmp);
	int t = 0, row = k;
	while(row){
		if(row == k){
			m = n - n/k*(k-1);
		}else{
			m = n / k;
		}
		vector<string> ans(m);
		ans[m / 2] = stu[t].name;
		//左边一列
		int j = m / 2 - 1;
		for(int i = t + 1; i < t + m; i = i + 2){
			ans[j--] = stu[i].name;
		} 
		//右边一列
		j =  m / 2 + 1;
		for(int i = t + 2; i < m + t; i = i + 2){
			ans[j++] = stu[i].name;
		}
		//输出当前排
		cout << ans[0];
		for(int i = 1; i < m; i++){
			cout << " " << ans[i];
		} 
		cout << endl;
		t = t + m; 
		row--;
	}
	return 0;
}
posted @ 2020-05-21 23:16  睿晞  阅读(117)  评论(0编辑  收藏  举报