Byte dance dynamic plan 6

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author Green.Gee
 * @date 2023/2/15 16:40
 * @email [email protected]
 */
public class DynamicPlan_6 {

    /**
     * 描述
     * 有n个房间,现在i号房间里的人需要被重新分配,分配的规则是这样的:先让i号房间里的人全都出来,接下来按照 i+1, i+2, i+3,
     *  ... 的顺序依此往这些房间里放一个人,n号房间的的下一个房间是1号房间,直到所有的人都被重新分配。
     *
     * 现在告诉你分配完后每个房间的人数以及最后一个人被分配的房间号x,你需要求出分配前每个房间的人数。数据保证一定有解,若有多解输出任意一个解。
     *
     * 输入描述:
     * 第一行两个整数n, x (2<=n<=10^5, 1<=x<=n),代表房间房间数量以及最后一个人被分配的房间号;
     * 第二行n个整数 a_i(0<=a_i<=10^9) ,代表每个房间分配后的人数。
     * 输出描述:
     * 输出n个整数,代表每个房间分配前的人数。
     * 示例1
     * 输入:
     * 3 1
     * 6 5 1
     * 复制
     * 输出
     * 4 4 4
     */
    public static void main(String[] args) {
        /**
         * Core
         *      清空数字后进行排序分配,经过排序之后最少的人数房间就是最开始初始化房间人数的位置
         *
         * 解:
         *      在分配后的房间内找到人数最少的房间,最少人数的就是最后分配的房间
         *      根据房间内人数最少的找到分配前的房间位置
         *      所有房间都减去最少人数
         *      计算从i 到 x 有多少房间数
         *      将多余人数补齐到room_i
         *
         */
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), room_x = in.nextInt() - 1;
        long [] room = new long[n];
        long p_min = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            room[i] = in.nextInt();
            if (room[i] < p_min) {
                p_min = room[i];
            }
        }

        int room_i = room_x;
        while (room[room_i] != p_min) {// 根据p_min 找到初始化房间好 room_i
            room_i = room_i > 0 ? room_i - 1 : n - 1;// room_x 之前的第一个最少人数的房间就是room_i
        }

        System.err.println(p_min);// 最小值 代表是最后分配的数字 的位置
        System.err.println(room_x);// 分配之后的位置
        System.err.println(room_i);// 分配之前的位置

        // 所有房间减去最少人数(最少人数是从0开始加,其他则减去分配到这个位置的人数)
        for (int i = 0; i < n; i++) {
            room[i] -= p_min;
        }

        int count = 0;
        int reminds = room_x;
        while (reminds != room_i) {
            room[reminds] -= 1;
            count += 1;

            reminds  = reminds > 0 ? reminds - 1 : n - 1;

        }

        // room_i 位置填充积累的和
        room[room_i] += count + n * p_min;


        System.out.println(Arrays.toString(room).replaceAll("\\[", "").replaceAll(",", "").replaceAll("\\]", ""));
  }
}

你可能感兴趣的:(算法【,Hard,Code】,java,算法)