有n个房间,现在i号房间里的人需要被重新分配,分配的规则是这样的:先让i号房间里的人全都出来,接下来按照 i+1, i+2, i+3, ... 的顺序依此往这些房间里放一个人,n号房间的的下一个房间是1号房间,直到所有的人都被重新分配。
现在告诉你分配完后每个房间的人数以及最后一个人被分配的房间号x,你需要求出分配前每个房间的人数。数据保证一定有解,若有多解输出任意一个解。
有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个整数,代表每个房间分配前的人数。
3 1 6 5 1
4 4 4
AC代码 开始timeout了,后来通过找到最小数,所有房间人数都先减去这个最小数, 然后遍历一遍即可。public static void computer() {Scanner scanner = new Scanner(System.in);int n, x;n = scanner.nextInt();x = scanner.nextInt();x--;long[] houses = new long[n];for(int i = 0; i < n; i++) {houses[i] = scanner.nextInt();}long min=houses[0];for(longhouse : houses) {if(house < min) {min = house;}}for(int i = 0; i < houses.length; i++) {houses[i]-=min;}long count=min*n;while(true) {if(houses[x]==0) {houses[x]=count;break;} else{houses[x]--;count++;}if(x <= 0) {x=houses.length-1;}else{x--;}}for(longhouse : houses) {System.out.print(house+" ");}}
package ByteDanceInterview;
import java.util.Scanner;
public class Room {
public static void main(String[] args) {
int n, k;
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
k = cin.nextInt();
int a[] = new int[n+1];
for (int i = 1; i <= n; i++) {
a[i] = cin.nextInt();
}
// 出去了多少人
int outPerson = 0;
//逆推
while(a[k]!=0) {
a[k]--;
outPerson++;
//k为房间号
k = (k - 1) % n;
if (k == 0)
k = n;
}
a[k] = outPerson;
for(int i=1;i<=n;i++) {
if(i!=n) {
System.out.print(a[i]+" ");
}else {
System.out.print(a[i]);
}
}
}
}
通过率80%