百度校招Java研发工程师笔试卷之还原数列

86 阅读1分钟

原题链接在牛客上的题目笔试题,大家有兴趣也可以去做做

一.题目

老板给度度熊n个数,每一次从a【i】中取出一个最大的数减去n,其他n-1个数加上1,一直重复直到最大的a[ i ]<n,执行次数为k,老板想知道最少要执行多少次操作才能使n个数都小于n?

输入描述:

第一行一个数。
第二行个数表示数列。

输出描述:

一个数表示

示例1

输入例子:

3
1 0 3

输出例子:

1

二.解析

直接上代码了!代码关键部分写在注释里了,希望能帮助到大家

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        long[] a = new long[n];
        for(int i =0 ;i < n;i ++) {
            a[i] = in.nextLong();
        }
        long sum = 0;
        while(!valid(a)) {
            long max = 0;
            int index =0 ;
            for(int i = 0;i < n;i ++) {
                if(a[i] > max) {
                    max = a[i];
                    index = i;
                }
            }
            sum += max / n;   // 把最大的恰好变小需要多少次
            for(int i = 0 ;i <n;i ++) {
                a[i] += max / n;   // 其余的都加上多少次个1
            }
            a[index] = max % n;
        }
        System.out.println(sum);
        
    }
    public static boolean valid(long[] a) {
        for(long aa : a) {
            if(aa >= a.length) return false;
        }
        return true;
    }
}