十三届蓝桥杯B组题:最少刷题数
题目描述
小蓝老师教的编程课有 N 名学生,编号依次是 1 . . . N。第 i 号学生这学期刷题的数量是 Ai。 对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题比他多的学生数不超过刷题比他少的学生数。
输入格式
第一行包含一个正整数 N。
第二行包含 N 个整数:A1, A2, A3, . . . , AN.
输出格式
输出 N 个整数,依次表示第 1 . . . N 号学生分别至少还要再刷多少道题。
样例输入
5 12 10 15 20 6
样例输出
0 3 0 0 7
提示
对于 30% 的数据,1 ≤ N ≤ 1000, 0 ≤ Ai ≤ 1000.
对于 100% 的数据,1 ≤ N ≤ 100000, 0 ≤ Ai ≤ 100000.
解决代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
// 复制原数组排序
int[] sortArr = Arrays.copyOfRange(arr, 0, arr.length);
Arrays.sort(sortArr);
// 获取中位数
int midNum = sortArr[arr.length / 2];
//获取比中位数大(小)的元素个数
int left = 0,right=0,m=arr.length/2;
for(int i=m;i>=0;i--) {
if(sortArr[i] < midNum) {
left = i+1;
break;
}
}
for(int i =m;i<arr.length;i++) {
if(sortArr[i] > midNum) {
right = arr.length - i;
break;
}
}
// 输出结果
for(int i = 0;i<arr.length;i++) {
if(arr[i] > midNum)System.out.print(0);
else if(arr[i] == midNum) {
System.out.print(left >= right?0:1);
}else {
int res = midNum - arr[i];
System.out.print(left > right ?res:res+1);
}
if(i!=n-1) {
System.out.print(" ");
}
}
}
}
