首页 > 编程语言 >1055 集体照(java)

1055 集体照(java)

时间:2025-01-18 13:29:19浏览次数:3  
标签:java String 集体照 int name Person public 1055

拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下:

  • 每排人数为 N/K(向下取整),多出来的人全部站在最后一排;

  • 后排所有人的个子都不比前排任何人矮;

  • 每排中最高者站中间(中间位置为 m/2+1,其中 m 为该排人数,除法向下取整);

  • 每排其他人以中间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);

  • 若多人身高相同,则按名字的字典序升序排列。这里保证无重名。

现给定一组拍照人,请编写程序输出他们的队形。

输入格式:

每个输入包含 1 个测试用例。每个测试用例第 1 行给出两个正整数 N(≤104,总人数)和 K(≤10,总排数)。随后 N 行,每行给出一个人的名字(不包含空格、长度不超过 8 个英文字母)和身高([30, 300] 区间内的整数)。

输出格式:

输出拍照的队形。即K排人名,其间以空格分隔,行末不得有多余空格。注意:假设你面对拍照者,后排的人输出在上方,前排输出在下方。

输入样例:

10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159

输出样例:

Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John

分析:这道题最核心的地方应该是理解怎么排序,在放拍照位置之前,要先将排序排好,由题意可知,排队要按照分数降序、同分情况下要按照名字的字符升序,题例的排序如下图:

按照题意的条件来排队拍照,这样排队就一致了。排队的方法参考了柳婼大神的做法,从中间的位置开始,确认好左右列开始的位置,然后每间隔一个人,填入名字。


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] num = br.readLine().split("\\s+");   //录入第一行的数字
        int N = Integer.parseInt(num[0]), K = Integer.parseInt(num[1]); //将N人K排分别通过字符串转整型
        Person[] p = new Person[N]; //定义N个Person数组
        for (int i = 0; i < N; i++) {
            String[] info = br.readLine().split("\\s+");    //获取名字、身高
            p[i] = new Person(info[0],Integer.parseInt(info[1]));   //填入每个人的信息
        }
        Arrays.sort(p);
        //一共有K排,从第K排开始排队
        int m = 0, t =  0;  //m——每排人数、t——从排序后的队首开始排队
        for (int i = K ; i >= 1 ; i--) {
            if ( i == K ) {
                m = N / K + N % K;  //最后一排的人数
            }else {
                m = N / K;  //其他排的人数
            }
            String[] str = new String[m];   //存放m个人的名字
            int j = m / 2;  //每排中间那个人的下标
            str[j] = p[t].getName();  //将最高的人排中间
            int left = j - 1, right = j + 1;    //分别排好左、右列的对
            for (int k = t + 1; k < t + m; k += 2) {    //将左边的人排好
                str[left--] = p[k].getName();
            }
            for (int k = t + 2; k < t + m; k += 2) {
                str[right++] = p[k].getName();
            }
            for (int l = 0; l < m; l++) {
                if (l != m - 1){
                    System.out.print(str[l] + " ");
                }else {
                    System.out.println(str[l]);
                }
            }
            t += m;
        }

    }
}
class Person implements Comparable<Person>{
    String name;
    int height;

    public Person(String name, int height) {
        this.name = name;
        this.height = height;
    }

    public String getName() {
        return name;
    }

    public int getHeight() {
        return height;
    }

    @Override
    public int compareTo(Person Other) {
        if(Other.getHeight() > this.getHeight()) {
            return 1;
        }else if(Other.getHeight() < this.getHeight() ) {
            return -1;
        }else {
            return this.getName().compareTo(Other.getName());
        }
    }
}

 结果没法AC好几个都超时了....可能这就是java的尿性吧

 后面对比别人的做法,发现是因为用了BufferReader输入流的原因,导致用时太久了,改了StreamTokenizer之后就可以用了。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StreamTokenizer st = new StreamTokenizer(br);
        st.nextToken();
        int N = (int)st.nval;
        st.nextToken();
        int K =  (int)st.nval;//将N人K排分别通过字符串转整型
        Person[] p = new Person[N]; //定义N个Person数组
        for (int i = 0; i < N; i++) {
            st.nextToken();
            String name = st.sval;
            st.nextToken();
            int age = (int)st.nval;
            p[i] = new Person(name, age);   //填入每个人的信息
        }
        Arrays.sort(p);
        //一共有K排,从第K排开始排队
        int m = 0, t =  0;  //m——每排人数、t——从排序后的队首开始排队
        for (int i = K ; i >= 1 ; i--) {
            if ( i == K ) {
                m = N / K + N % K;  //最后一排的人数
            }else {
                m = N / K;  //其他排的人数
            }
            String[] str = new String[m];   //存放m个人的名字
            int j = m / 2;  //每排中间那个人的下标
            str[j] = p[t].getName();  //将最高的人排中间
            int left = j - 1, right = j + 1;    //分别排好左、右列的对
            for (int k = t + 1; k < t + m; k += 2) {    //将左边的人排好
                str[left--] = p[k].getName();
            }
            for (int k = t + 2; k < t + m; k += 2) {
                str[right++] = p[k].getName();
            }
            for (int l = 0; l < m; l++) {
                if (l != m - 1){
                    System.out.print(str[l] + " ");
                }else {
                    System.out.println(str[l]);
                }
            }
            t += m;
        }

    }
}
class Person implements Comparable<Person>{
    String name;
    int height;

    public Person(String name, int height) {
        this.name = name;
        this.height = height;
    }

    public String getName() {
        return name;
    }

    public int getHeight() {
        return height;
    }

    @Override
    public int compareTo(Person Other) {
        if(Other.getHeight() > this.getHeight()) {
            return 1;
        }else if(Other.getHeight() < this.getHeight() ) {
            return -1;
        }else {
            return this.getName().compareTo(Other.getName());
        }
    }
}

 

 

标签:java,String,集体照,int,name,Person,public,1055
From: https://blog.csdn.net/2403_89522296/article/details/145224178

相关文章

  • 2025.1.18 JavaScript基础
    1、变量的定义var变量名例如:<html> <body> <scripttype="text/javascript"> functionzhaoling(){ n=Number(document.form1.txt1.value); if(n!=parseInt(n/1)||n<1||n>100) { alert("请输入一个1-100的整数"); ......
  • springboot+vue+java大学生健康管理系统 867i9
    目录系统实现截图开发核心技术介绍技术栈核心代码部分展示操作手册视频演示/源码获取系统实现截图开发核心技术介绍springboot+Element-UI+vue本系统采用MVVM模式,开发框架使用SpringBoot框架,开发工具使用IDEA,VisualStudioCode,Web服务器使用Tomcat,数据库服......
  • Java虚拟机(JVM)深入解析
    Java虚拟机(JVM)是Java程序运行的核心环境,它负责将Java字节码转换为机器码并执行。本文将深入解析JVM的运行时数据区、类加载机制以及执行引擎,帮助读者更好地理解JVM的工作原理。一、运行时数据区(RuntimeDataArea)运行时数据区是JVM在执行Java程序时分配的内存区域,主要包括以......
  • JAVA多线程
           一多线程基础知识相关概念进程(Process):进程是程序的基本执行实体。进程是操作系统分配资源的基本单位。每个进程都有自己的内存空间、代码段、数据段等。进程之间相互独立,一个进程的崩溃不会影响其他进程。进程是程序的基本执行实体。线程(Thread): ......
  • Java集合小结
    、这一节先快速回顾所学集合知识(抓要点,不深追底层代码),下一节复习集合的八股文狠狠学java,猛猛赚他一笔!一集合体系图集合分为单列集合和双列集合,先来看集合体系图二单列集合2.1List之三种遍历方式 iterator迭代器遍历(idea快捷键itit)Listlist=newArrayList();It......
  • JAVA:根据经纬度获取夏令时以及偏移(免费)
    注:国内根据经纬度来获取夏令时区以及时区偏移量的api的服务有百度和谷歌,但是谷歌的获取夏令时和时区的api在国内服务其上部署时访问不了的(看过有在服务器上安装代理的,但是操作有点复杂。好吧,其实是我看着步骤太多,感觉太麻烦所以直接pass了)。所以目前在我获取到的信息中,只有百......
  • JAVA安全之JDK8u141版本绕过研究
    基本介绍从JDK8u141开始JEP290中针对RegistryImpl_Skel#dispatch中bind、unbind、rebind操作增加了checkAccess检查,此项检查只允许来源为本地,下面以bind为例:publicvoiddispatch(Remotevar1,RemoteCallvar2,intvar3,longvar4)throwsException{if(var4!=4......
  • Java初学者笔记-04、异常与泛型
    异常异常代表程序出现的问题。Error错误和Exception异常。RuntimeException运行时异常。编译时异常,提醒程序员这里的程序很容易出错。异常的基础处理抛出给上层调用者。使用try-catch处理。异常的处理方案底层异常抛出,最外层捕获异常记录异常并响应合适信息。(少见)最......
  • leetcode——接雨水(java)
    给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示雨水)。示例......
  • 【2024年华为OD机试】 (A卷,200分)- 硬件产品销售方案(Java & JS & Python&C/C++)
    一、问题描述题目描述某公司目前推出了AI开发者套件,AI加速卡,AI加速模块,AI服务器,智能边缘多种硬件产品,每种产品包含若干个型号。现某合作厂商要采购金额为amount元的硬件产品搭建自己的AI基座。例如当前库存有N种产品,每种产品的库存量充足,给定每种产品的价格,记为price(不......