当前位置: 首页 > news >正文

1109 Group Photo

题意:模拟队伍的排列。给出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 <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=10005;

struct Person{
    string name;
    int height;
}stu[N];

vector<int> format[N];//resulting formation

bool cmp(Person a,Person 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;
    for(int i=0;i<n;i++){
        cin>>stu[i].name>>stu[i].height;
    }
    sort(stu,stu+n,cmp);

    //先确定每排的人数
    int cnt=n/k, row=0;
    while(row<k-1){//先排前k-1排
        format[row].resize(cnt+1);//每排的人数实则cnt,多申请一个空间是因为从下标1开始
        row++;
        n-=cnt;
    }
    format[row++].resize(n+1);//剩余的排在第k排

    int idx=0;
    for(int r=row-1;r>=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<format[r].size();c++){
            int i=format[r][c];
            cout<<stu[i].name;
            if(c<format[r].size()-1) cout<<' ';
            else cout<<'\n';
        }
    }
    return 0;
}

 

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

相关文章:

  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十一 || AOP自定义筛选,Redis入门 11.1...
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 串口发送数据速度
  • Lsb图片隐写
  • react-native-echarts 在手机上 图表出现滚动条解决方法
  • Python利用Selenium自动登录掘金
  • ASP.NET CORE Combines Angular to Create SPA
  • 海量数据处理 - 十道面试题与十个海量数据处理方法总结
  • 如何搭建一个完整的交易框架
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • easyui datagrid 相关取数据总结
  • 平台化技术:从C/S到B/S
  • ckeditor 3.6在IE11不能粘贴
  • SQLServer之修改DEFAULT约束
  • LinkedList源码
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【node学习】协程
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 0x05 Python数据分析,Anaconda八斩刀
  • angular2 简述
  • css选择器
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • PhantomJS 安装
  • PHP CLI应用的调试原理
  • Redis字符串类型内部编码剖析
  • Web设计流程优化:网页效果图设计新思路
  • 阿里云Kubernetes容器服务上体验Knative
  • 浅谈web中前端模板引擎的使用
  • 小而合理的前端理论:rscss和rsjs
  • 小试R空间处理新库sf
  • No resource identifier found for attribute,RxJava之zip操作符
  • ionic入门之数据绑定显示-1
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Linux权限管理(week1_day5)--技术流ken
  • # Maven错误Error executing Maven
  • #if #elif #endif
  • $.proxy和$.extend
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (007)XHTML文档之标题——h1~h6
  • (1)(1.11) SiK Radio v2(一)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (二)Eureka服务搭建,服务注册,服务发现
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (三) diretfbrc详解
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (推荐)叮当——中文语音对话机器人
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)fock函数详解
  • (转)linux下的时间函数使用
  • (转)大道至简,职场上做人做事做管理
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net framework4与其client profile版本的区别