题目描述
生活在在外星球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");
}
}
}