Java 算法 面试

题目描述

生活在在外星球X上的小Z想要找一些小朋友组成一个舞蹈团,于是他在网上发布了信息,一共有n个人报名面试。面试必须按照报名的顺序依次进行。小Z可以选择在面试完若干小朋友以后,在所有已.经.面.试.过.的小朋友中进行任意顺序的挑选,以组合成一个舞蹈团。

虽然说是小朋友,但是外星球X上的生态环境和地球上的不太一样,这些小朋友的身高可能相差很大。小Z希望组建的这个舞蹈团要求至.少.有m个小朋友,并且这些小朋友的最高身高和最低身高之差不能超过k个长度单位。

现在知道了这些小朋友的身高信息,问小Z至少要面试多少小朋友才能在已经面试过的小朋友中选出不少于m个组成舞蹈团。

【样例1输入】

6 3 5

170 169 175 171 180 175

【样例1输出】

4

【样例1解释】

当面试了前4个小朋友之后,这些小朋友的身高分别为170;169;175;171,可选出

身高为170;175;171的小朋友组成舞蹈团,故只用面试4个小朋友即可。

【样例2输入】

6 4 5

170 169 175 171 180 175

【样例2输出】

6

【样例2解释】

在这个样例中,小Z需要面试所有小朋友,才能选出身高为170;175;171;175的小

朋友组成舞蹈团。

【样例3输入】

6 5 5

170 169 175 171 180 175

【样例3输出】

impossible

输入
从标准输入读入数据。

第一行3个整数n;m;k,意义见题面描述;1≤m≤n≤105; 0≤k≤105;

第二行n个整数,第i个数hi表示第i个报名面试的小朋友的身高,1≤hi≤105。

输出
输出到标准输出。

如果可以选出舞蹈团,输出至少要面试多少人;否则输出impossible。

解题思路

运用列表,排序后依次比较,注意从满足人数后开始比较。

代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();        //报名的人数
        int m=scanner.nextInt();        //选择的人数
        int k=scanner.nextInt();        //最大差值
        int []x=new int[n];
        int z=0;                        //计算面试的次数
        ArrayList<Integer> y=new ArrayList<>();
        for (int i=0;i<n;i++){
            x[i]=scanner.nextInt();         //输入到数组
            if (i<m){
                y.add(x[i]);                //添加进列表
            }else {
                Collections.sort(y);        //对列表排序
                if (y.get(y.size()-1)-y.get(i-m)<=k){   //判断是否满足条件
                    z=i;
                    break;
                }else if(y.size()-m>0){
                    for (int j=0;j<y.size()-m;j++){
                        if (y.get(m+j)-y.get(j)<=k){
                            z=i;
                            break;
                        }
                    }
                    if (y.get(m-1)-y.get(0)<=k){
                        z=i;
                        break;
                    }
                } else {
                    y.add(x[i]);            //若当前不能满足 继续面试
                }
            }
        }
        if (z!=0){
            System.out.println(z);          //输出
        }else {
            System.out.println("impossible");
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

future furuer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值