思路:使用两个数组来做,数组num用来存储学生刷题数,数组num1将刷题数按照从小到大的顺序排列,根据思考需要刷题的人是前半部分的人数,在num1中一次找到num[i](i从0开始)的位置。
如果在num1的前半部分,则需要增加刷题,反之则不需要。
需要刷题的数量是中间刷题值-本身刷题值+1
import java.util.Arrays;
import java.util.Scanner;
public class Test04 {
public static void main(String[] args) {
System.out.println("请输入n:");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
//存储做题数的数组
int[] num = new int[n];
//用来排序的数组
int[] num1 = new int[n];
for(int i = 0; i < num.length; i++){
num[i] = input.nextInt();
num1[i] = num[i];
}
Arrays.sort(num1);
for(int i = 0; i < n; i++){
//在num1中一次找到num[i](i从0开始)的位置
int pos = Arrays.binarySearch(num1, num[i]);
//左边的是比num[i]刷题量少的值
int left = pos;
//右边的是比num[i]刷题量多的值
int right = n - 1 - pos;
//刷题多的多于刷题少的
if(left < right){
int d = num1[n / 2] - num1[pos] + 1;
System.out.print(d + " ");
}else{
System.out.print(0 + " ");
}
}
}
}