题目描述
有一个花园,其中有n朵花,每朵花都有一个初始长度。每天都会去浇水,浇水后每朵花长度会增高1。
每天挑选n-1朵花浇水,问最少多少天所有的花会一样长?
输入
第一行 一个整数n 表示花的个数
第二行 n 个整数ai 表示每朵花的初始长度 (0≤i <n )
输出
一个整数 表示使所有元素相等的最小操作次数
测试点数据规模与约定
对于100%的测试点,保证0<n <104,0≤ai <104
样例输入复制
3 1 2 3
样例输出复制
3
提示
样例数据中,每次操作增加2个元素的值 ,最少操作3次
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
方法一:暴力解题
思路:贪心算法
若花高度按从小到大排序,则每次一定是浇前 n-1 朵,每次浇水我们要做的就是缩小较矮的花和高度最高的花的高度差
直到最终所有花高度一致
细节:
1.每次如何浇水
①排序
②数组遍历前 n-1 位加 1
2.如何判断每朵花高度都达到一致
用和来判断
每朵花高度都一致时有:
找出花高度最大值 × 花数量n = 所有花高度之和
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//花的数量
int[] arry1 = new int[n];
for (int i = 0; i < n; i++) {
arry1[i] = sc.nextInt(); //每朵花初始高度
}
//特殊情况1,只有一朵花
if ( n == 1) {
System.out.println(0);
return;
}
//特殊情况2,初始所有花高度·已经一致
Arrays.sort(arry1); // 排序
if (arry1[0] == arry1[n-1] ) {
System.out.println(0);
return;
}
int count = 0;//记录浇水次数
while (true){
Arrays.sort(arry1); //排序,然后浇水,计数
for (int i = 0; i <n-1 ; i++) {
arry1[i]++;
}
count++;
Arrays.sort(arry1);
int max = arry1[n-1]; //找到最高的花的高度
//循环遍历,用max = Math.max(max,arry1[i])记录出最大值也行
int sum = 0; //计算花的高度总和
for (int i = 0; i < n; i++) {
sum += arry1[i];
}
//判断花的高度是否都一致
if (sum == (max * n)) {
System.out.println(count);
break;
}
}
}
}
测试结果:
方法二: 其他大佬写的
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n= sc.nextInt();
int[] arr=new int[n];
int ans=0;
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
int min=Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
min=min<arr[i]?min:arr[i];
}
//每浇一次,就能使最小值与没被浇的差-1
for (int num : arr) {
ans += num - min;
}
System.out.println(ans);
}
}
如有错误,欢迎指正😎😎😎