十三届蓝桥杯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(" ");
        	}
        }
    }
}
经验分享 程序员 微信小程序 职场和发展