蓝桥与力扣刷题(蓝桥 最少刷题数)
题目:小蓝老师教的编程课有 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
解题思路+代码:(二分法思路)引用题解区通过全部用例(作者:秋叶 解题思路:先排序,再基于中值两侧元素数量的比较进行输出)
代码:
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException{
int n = Integer.parseInt(br.readLine());
String[] str = br.readLine().split(" ");
// 转为整型数组
int[] nums = new int[n];
for(int i=0; i<n; i++) {
nums[i] = Integer.valueOf(str[i]);
}
// 对数组进行排序
int[] arr = nums.clone();
Arrays.sort(arr);
// 得到中值
int mid = arr[n/2];
// 计算小于或大于中值的元素个数
int less = 0;
int more = 0;
for (int i=0; i<n; i++) {
if (nums[i] < mid)
++ less;
else if(nums[i] > mid)
++ more;
}
// 进行判断,输出结果
for(int i=0; i<n; i++) {
if(nums[i] > mid)
System.out.print("0 ");
else if(nums[i] == mid && less >= more)
System.out.print("0 ");
else if(nums[i] == mid && less < more)
System.out.print("1 ");
else if(nums[i] < mid && less > more)
System.out.print(mid-nums[i] + " ");
else if(nums[i] < mid && less <= more)
System.out.print(mid-nums[i]+1 + " ");
}
}
}
解题思路+代码:(暴力枚举+avg)(个人思路 通过30%用例)
代码:
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[] num = new int[n+2]; //防止数组下标越界
for(int i = 1; i<=n; i++) num[i] = scan.nextInt(); //存放n名学生的刷题数量
double sum = 0;//n名学生刷题的总数量
int avg = 0; //n名学生刷题的平均数量
int task = 0; //需要再刷的题量
for(int i = 1; i<=n; i++){
sum += num[i]; //63
}
avg = (int)(Math.ceil(sum / (double) n)); //平均数向上取整 avg = 13
for (int i = 1; i <= n; i++) {
// 计算每个学生需要再刷的题量
int countMore = 0; // 比自己刷题量多的人数
int countLess = 0; // 比自己刷题量少的人数
for (int j = 1; j <= n; j++) {
if (num[i] < num[j]) {
countMore++;
} else if (num[i] > num[j]) {
countLess++;
}
}
if (countMore > countLess) {
task = avg - num[i];
} else if (countMore <= countLess) {
task = 0;
}
System.out.print(task > 0 ? task + " " : 0 + " ");
}
scan.close();
}
}
总结: 路漫漫其修远兮,吾将上下而求索,接下来也会更多地去考虑题目中的一些逻辑和细节方面的问题。