Byte dance dynamic plan 6

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

/**
 * @author Green.Gee
 * @date 2023/2/15 16:40
 * @email green.gee.lu@gmail.com
 */
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("\\]", ""));
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P("Struggler") ?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值