题目:分配房间
题目描述:
有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
分析:一开始我也没能想明白,反推的这种思想太弱了。首先能确定的就是,在分配好的房间中,人数最少的就是i房间,因为,他是最后一个才能分配的(从他后面的开始分配),然后确定最少的人数min,就知道有几次是一整论的,给每个房间都减去min,这时候被分配的房间人数已经为0,而最后一个人在的房间倒退会被分配的房间还多一个,所以在进行一次循环,知道找到被分配的房间,加上之前减去的所有人数即可,看代码吧,还是go语言的,好理解
代码:
package main
import "fmt"
func main() {
n,x:=0,0
fmt.Scan(&n,&x)
arr:=[]int{}
min:=2^31-1
for i:=0;i<n;i++{
temp:=0
fmt.Scan(&temp)
arr=append(arr,temp)
if min>temp{
min=temp
}
}
sum:=0
for i:=0;i<n;i++{
arr[i]-=min
sum+=min
}
point:=x-1
for{
if arr[point]==0{
break
}
arr[point]--
sum++
if point==0{
point=n-1
}else{
point--
}
}
arr[point]=sum
for i:=0;i<n;i++{
if i==n-1{
fmt.Print(arr[i])
}else{
fmt.Print(arr[i]," ")
}
}
}
题目:求最大子矩阵
题目描述:
这是我根据一道题改编的,就是给定一个m行n列的矩阵,求出和最大的子矩阵,这里主要是想说明一下动态规划的算法,即在一个二维数组中,第i行j列储存的就是i行j列矩阵的和
dp[i][j]+=ap[i-1][j]+dp[i][j-1]-dp[i-1][j-1]
但是要注意的时,在go语言中,第一行。第一列,要拿出来单独计算,否则会panic,溢出
先看代码:
func main(){
m,n:=0,0
fmt.Scan(&m,&n)
arr:=[][]int{}
for i:=0;i<m;i++{
nums:=[]int{}
for j:=0;j<n;j++{
temp:=0
fmt.Scan(&temp)
nums=append(nums,temp)
}
arr=append(arr,nums)
}
for i:=1;i<m;i++{
arr[i][0]+=arr[i-1][0]
fmt.Println(arr[i][0])
}
for i:=1;i<n;i++{
arr[0][i]+=arr[0][i-1]
}
for i:=1;i<m;i++{
for j:=1;j<n;j++{
arr[i][j]+=arr[i-1][j]+arr[i][j-1]-arr[i-1][j-1]
}
}
max:=arr[0][0]
x:=0
y:=0
for i:=0;i<m;i++{
for j:=0;j<n;j++{
if max<arr[i][j]{
max=arr[i][j]
x=i
y=j
}
}
}
fmt.Println(max,x,y)
}
返回的就是和最大的值以及下标