最少刷题数
问题描述
小蓝老师教的编程课有 NN 名学生, 编号依次是 1…N1…N 。第 ii 号学生这学期 刷题的数量是 AiAi 。
对于每一名学生, 请你计算他至少还要再刷多少道题, 才能使得全班刷题 比他多的学生数不超过刷题比他少的学生数。
输入格式
第一行包含一个正整数 NN 。
第二行包含 NN 个整数: A1,A2,A3,…,ANA1,A2,A3,…,AN.
输出格式
输出 NN 个整数, 依次表示第 1…N1…N 号学生分别至少还要再刷多少道题。
样例输入
5
12 10 15 20 6
样例输出
0 3 0 0 7
1.主要目的:找寻排序过后的刷题中间数
具体思路如下:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//利用数组下标表示学生 值表示刷题数
//对数组进行排序 寻找刷题中间数
//输出中间刷题数减去已刷题数量
int n=scan.nextInt();
int [] arry=new int[n];
int temp=0;
for(int i=0;i<n;i++){
arry[i]=scan.nextInt();
}
int []arry2=new int[n];
for(int j=0;j<n;j++){
arry2[j]=arry[j];//复制原数据
}
//冒泡排序
for (int i = 0; i < n - 1; i++) { // 控制遍历次数
for (int j = 0; j < n - 1 - i; j++) { // 内部比较和交换
if (arry[j] > arry[j + 1]) { // 相邻元素比较
temp = arry[j];
arry[j] = arry[j + 1];
arry[j + 1] = temp; // 交换元素
}
}
}
// Arrays.sort(arry);可以直接利用该方法实现快速排序
int num=0;
num=arry[(n/2)];//查询中间值
for(int i=0;i<n;i++){
System.out.print(Math.max(0, median - arry2[i])+" ");//比较大小 使得所有负数都为0
}
scan.close();
}
}
注意点:
1.判断学生奇数偶数的影响;
在查找该题中排序后中间值的成绩要仔细分析其下标位置
如果是偶数个如:1 2 3 4 5 6 根据题目要求(刷题比他多的学生数<=刷题比他少的学生数)
则我们需要寻找到中间值4 当小于4的数刷到4个题时,恰好(刷题比他多的学生数=刷题比他少的学生数)符合要求 则目标下标6/2==3为n/2;
如果是奇数个如:1 2 3 4 5 6 7 根据题目要求(刷题比他多的学生数<=刷题比他少的学生数)
则我们需要寻找到中间值4 当小于4的数刷到4个题时,恰好(刷题比他多的学生数=刷题比他少的学生数)符合要求 则目标下标7/2==3依然为n/2;
经过分析 奇偶数没有影响
2.
java中Arrays.sort(arry);可以实现快速排序