问题描述
输入输出
解题思路
可以排序后取中位数,但是中位数可能有多个,可能往左延伸也可能往右延伸,需要考虑的情况有点麻烦。如果直接用模拟的话,可以简单直接地找到符合题意的中位数以及区间。最后再for一遍原数组判断输出即可。
AC代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] zu1 = new int[n + 1];
int[] zu2 = new int[n + 1];
// 下标从1开始
for (int i = 1; i <= n; i++) {
zu1[i] = scan.nextInt();
zu2[i] = zu1[i];
}
// 升序排序
Arrays.sort(zu2);
int ans = -1; // 需要达到的刷题目标
// left和right是指针,left指向左内边界,right指向右外边界
int left = 0;
for (int right = 1; right <= n && ans == -1; ) {
left = right;
right++;
// 移动right跳过相同分数的人
while (right <= n && zu2[right] == zu2[right - 1])
right++;
// 比较两侧人数
int leftNum = left - 1, rightNum = n - (right - 1);
if (leftNum > rightNum) {
ans = zu2[left];
} else if (leftNum == rightNum) {
ans = zu2[left] + 1; // 等于的情况下,要多做一道题,否则左半边会小于右半边
}
}
// 遍历未排序的数组
for (int i = 1; i <= n; i++) {
int need = 0;
// 左半边需要补题
if (zu1[i] < zu2[left])
need = ans - zu1[i];
System.out.print(need + " ");
}
}
}
(by 归忆)