编程题2
编程题2
题目描述
有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
思路:
找出last左右边最小的数,如果左右边最小的数相等,就选last左边的最小数,写的像屎一样的代码,不想写思路了
代码:
package main
import "fmt"
func main(){
var n,last,min,min1 int
fmt.Scan(&n,&last)
num := make([]int,n)
//找出last左右边最小的数,如果左右边最小的数相等,就选last左边的最小数
for i:=0;i<last;i++{
fmt.Scan(&num[i])
if i==0{
min = i
}else{
if num[min] >=num[i]{
min = i
}
}
}
for i:=last;i<n;i++{
fmt.Scan(&num[i])
if i==last{
min1 = i
}else{
if num[min1] >=num[i]{
min1 = i
}
}
}
if num[min]>num[min1]{
min = min1
}
sum :=0
minNum :=num[min]
if last < min+1{
for i:=min+1;i<n;i++{
num[i] -=minNum+1
}
for i:=0;i<last;i++{
num[i] -=minNum+1
}
for i:=last;i<=min;i++{
num[i] -=minNum
}
sum = (last+n-(min+1))*(minNum+1)+(n-last-(n-(min+1)))*minNum
}else if last>min+1{
for i:=0;i<=min;i++{
num[i] -=minNum
}
for i:=last;i<n;i++{
num[i] -=minNum
}
for i:=min+1;i<last;i++{
num[i] -=minNum+1
}
sum = (last-min-1) *(minNum+1)+(n-(last-min)+1)*minNum
}else{
for i:=0;i<n;i++{
num[i]-=minNum
}
sum = n*minNum
}
num[min] = sum
for i:=0;i<n;i++{
if i==0{
fmt.Printf("%d",num[i])
}else{
fmt.Printf(" %d",num[i])
}
}
}
代码效率:
运行时间:686ms, 超过66.67%用Go提交的代码
占用内存:6812KB, 超过83.33%用Go提交的代码
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!