题目一:淘汰分数
某比赛已经进入了淘汰赛阶段,已知共有n名选手参与了此阶段比赛,他们的得分分别是a_1,a_2….a_n,小美作为比赛的裁判希望设定一个分数线m,使得所有分数大于m的选手晋级,其他人淘汰。但是为了保护粉丝脆弱的心脏,小美希望晋级和淘汰的人数均在[x,y]之间。显然这个m有可能是不存在的,也有可能存在多个m,如果不存在,请你输出-1,如果存在多个,请你输出符合条件的最低的分数线。
- 输入第一行仅包含三个正整数n,x,y,分别表示参赛的人数和晋级淘汰人数区间。
- 输入第二行包含n个整数,中间用空格隔开,表示从1号选手到n号选手的成绩。
- 输出仅包含一个整数,如果不存在这样的m,则输出-1,否则输出符合条件的最小的值。
import java.util.*;
/*
本题其实和输入的分数没有关系 只和总人数 还有淘汰区间[x,y]有关
若总人数n-y>y;比如10个人,[2,4];10-4>4;说明不管怎么分都不可能使得淘汰的和通过的人数都在区间[2,4];
*/
public class One {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int x = input.nextInt();
int y = input.nextInt();
int[] scores = new int[n];
for (int i = 0; i < n; i++) {
scores[i] = input.nextInt();
}
Arrays.sort(scores);
int value=n-y;
//n-y>y;比如10个人,[2,4];10-4>4;说明不管怎么分都不可能使得淘汰的和通过的人数都在区间[2,4];
if (value>y){
System.out.println(-1);
//n-y在区间[x,y];比如7个人,[2,4];7-4=3;
// 则返回第三个位置的人的分数 因为数组下标从0开始,所以第三个位置下标是2也就是value-1
}else if (value>=x && value<=y){
System.out.println(scores[value-1]);
//n-y<x;比如3个人,[2,4];3-4=-1; 返回分数第x位置的人的分数 同上
}else{
System.out.println(scores[x-1]);
}
}
}
题目二:正则序列
我们称一个长度为n的序列为正则序列,当且仅当该序列是一个由1~n组成的排列,即该序列由n个正整数组成,取值在[1,n]范围,且不存在重复的数,同时正则序列不要求排序;一个长度为n的任意序列s,需要在有限次操作内,将这个序列变成一个正则序列,每次操作可以任选序列中的一个数字,并将该数字加一或者减一。最少用多少次操作可以把这个序列变成正则序列?
- 输入第一行仅包含一个正整数n,表示任意序列的长度。
- 输入第二行包含n个整数,表示给出的序列,每个数的绝对值都小于10000。
- 输出仅包含一个整数,表示最少的操作数量。
import java.util.*;
/**
* 正则序列:核心:贪心算法 每一个数字最短距离是升序后:a[i]到i的绝对值
* 比如升序后序列 -1 3 4 19 100 长度5 则正则序列是【1,5】
* 1 2 3 4 5 -1到1的最短距离就是 |-1-1|=2 3到2的最短距离 |3-2|=1;
* 但我们数组一般下标从0开始,所以是 |a[i]-(i+1)|
* 或者从1开始,就是|a[i-1]-i|
*/
public class Three {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int arr[]=new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i]=input.nextInt();
}
//对数组进行升序排序
Arrays.sort(arr);
int count=0;
for (int i = 0; i < n; i++) {
count+=Math.abs(arr[i]-(i+1));
}
System.out.println(count);
}
}
题目三:字符串空格个数
给出一行仅包含空格和小写英文字母的字符串s;其中空格代表被吸走的字符,小写英文字母则是没有被吸走,留下来的字符。
s的长度<=10000输出仅包含一个正整数,表示黑洞吸走的字母数量
public class Two {
//核心:toCharArray()方法 把字符串变成单个字符类型的数组
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String s=input.nextLine();
int count=0;
char[] chars=s.toCharArray();
for (int i=0;i<chars.length;i++){
if (chars[i]==' '){
count++;
}
}
System.out.println(count);
}
}