写在前面
- 实现思路
- 结构体容器数组封装学生元数据信息
- 自定义比较函数
- 容器数组根据身高倒排后,分排
- 某一排,从原始数组中取第1位放中间
- 间隔顺序迭代放置左边、右边
- 具体代码
-
for(i=t+1; i<t+m; i=i+2)
-
for(i=t+2; i<t+m; i=i+2)
- 打印输出当前排
- 注意输出格式,行末不得有多余空格
- 实现方案有难度,多练习,否则该类题目有挂掉风险
测试用例
input:
10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159
output:
ac代码
- 1109. Group Photo (25)-PAT甲级真题
- 推荐,逻辑清晰、容易块儿化理解
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct node
{
string name;
int height;
};
int cmp(node a, node b)
{
return a.height!=b.height ? a.height>b.height : a.name<b.name;
}
int main()
{
int n, k, m, i, j;
scanf("%d%d", &n, &k);
vector<node> stu(n);
for(i=0; i<n; i++)
cin >> stu[i].name >> stu[i].height;
sort(stu.begin(), stu.end(), cmp);
int t = 0, row = k;
while(row)
{
m = row==k ? n-n/k*(k-1) : n/k;
vector<string> stmp(m);
stmp[m/2] = stu[t].name;
/* 赋值左边列 */
j = m/2-1;
for(i=t+1; i<t+m; i=i+2)
stmp[j--] = stu[i].name;
/* 赋值右边列 */
j = m/2+1;
for(i=t+2; i<t+m; i=i+2)
stmp[j++] = stu[i].name;
printf("%s", stmp[0].data());
for(i=1; i<m; i++)
printf(" %s", stmp[i].data());
printf("\n");
t = t+m;
row--;
}
return 0;
}