博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1109 Group Photo
阅读量:7079 次
发布时间:2019-06-28

本文共 1321 字,大约阅读时间需要 4 分钟。

题意:模拟队伍的排列。给出n个人,要求排成k排,每排人数必须为n/k,剩余的排在最后一排。第(i+1)排的人不得矮于第i排的人,每一排当中,最高的人排在center=m/2+1,第二高的排在最高者的左边,第三高的排在最高者的右边...以此类推。要求输出队伍排列。

思路:首先根据题目规则排序,然后确定每排的人数,前k-1排的人数为m=n/k,最后一排的人数为n-m*(k-1)。然后从最后一排开始排队伍(假设共有row排,记最后一排为row-1),在每一排当中,先确定中间位置,即center=m/2+1,然后分别令left=center-1,right=center+1,同时对两侧进行排序(这么处理是关键,相当于two pointers的思想!),最后记得判断一下左边是不是还剩一个没排好的,因为当一排的人数为偶数个时,最后一个是不成对的!

ps:纯粹的模拟,侧重考察代码功底,coding能力较弱的就比较耗时间,比如说我。。。要勤加练习。

代码:

#include 
#include
#include
using namespace std;const int N=10005;struct Person{ string name; int height;}stu[N];vector
format[N];//resulting formationbool cmp(Person a,Person b){ if(a.height!=b.height) return a.height>b.height; else return a.name
>n>>k; for(int i=0;i
>stu[i].name>>stu[i].height; } sort(stu,stu+n,cmp); //先确定每排的人数 int cnt=n/k, row=0; while(row
=0;r--){ int m=format[r].size(); m--; int center=(m/2)+1;//中间位置 format[r][center]=idx++; int left=center-1,right=center+1; while(left>=1 && right<=m ){ format[r][left]=idx++; left--; format[r][right]=idx++; right++; } if(left==1) format[r][left]=idx++;//当一排人数为偶数个时 } //output for(int r=row-1;r>=0;r--){ for(int c=1;c

 

转载于:https://www.cnblogs.com/kkmjy/p/9553730.html

你可能感兴趣的文章
【Unity技巧】统一管理回调函数——观察者模式
查看>>
ZooKeeper基本原理
查看>>
DLLImport
查看>>
创建、删除文件和文件夹命令
查看>>
(1)Django框架学习-开篇
查看>>
Hystrix框架5--请求缓存和collapser
查看>>
Linux下实现免密登录
查看>>
sql 单个字段去重查询 distinc 和 group by的效率问题
查看>>
找1到n所有整数出现1的个数
查看>>
又是周一
查看>>
Hadoop 面试题之四
查看>>
实训二 博客一
查看>>
nginx对端口的处理 -- 第三篇
查看>>
CentOS7下安装MySQL5.7安装与配置(YUM)
查看>>
TODO
查看>>
web 端即时通讯
查看>>
jmeter代理录制的方法
查看>>
Windows7环境下MongoDB安装和配置
查看>>
百度搜索框自动补全
查看>>
通过html5 touch事件封装手势识别组件
查看>>