一、小Q爬塔
1、题目描述:
小Q正在攀登一座宝塔,这座塔很特别,塔总共有n曾层,但是每两层之间的净高却不相同,所以造成了小Q爬过每层的时间也不同。如果某一层的高度为x,那么爬过这一层所需的时间也是x。小Q还会使用一种魔法,每用一次可以让他向上跳一层或两层,但是每次跳跃之后小Q都将用完魔法力,必须爬过至少一层才能再次跳跃(你可以认为小Q需要跳两次一层才休息,最后也可以跳到塔外即超过塔高,跳是不消耗时间的)。
小Q想用最短的时间爬过塔顶,希望你能告诉他最短时间是多少。
2、输入描述:
第一行一个数n(n<=10000),表示塔的层数.
接下来的n行每行一个数h(1<=h<=100),表示从下往上每层的高度.
3、输出描述:
一个数,表示最短时间。
4、例如
输入:
5
3
5
1
8
4
输出:
1
5、解题思路:
这道题类似于之前刷的数组类的题目,跳台阶、斐波那契数列等系列的问题,使用的就是递归。
-
小Q还会使用一种魔法,每用一次可以让他向上跳一层或两层
说明到达当前层时,可以是由上一层或前两层跳过来的,也可以是上一层爬过的。 -
但是每次跳跃之后小Q都将用完魔法力,必须爬过至少一层才能再次跳跃
当然只是休息一层最省时间,说明如果之前是使用跳跃到达的此层,那么这次就要加上这层的时间。
综上,需要表示出到达该层的方式是跳还是爬,也就是判断该层是不是休息层。
用两个矩阵记录到达第 i 层的最短时间,方式分别是爬和跳:
C
[
i
]
C[i]
C[i] : 表示到达地i层的最短时间,并且到达第i层的方式是爬。
J
[
i
]
J[i]
J[i] : 表示到达第i层的最短时间,并且到达第i层的方式是跳。
- 情况1:到达第i层所用的方式是爬:
那么到达第 i-1 层的方式也可以使用跳也可以是爬,从两者中选择最小。
C [ i ] = m i n ( C [ i − 1 ] , J [ i − 1 ] ) + h [ i ] \bm { C[i] = min (C[i-1], J[i-1]) + h[i]} C[i]=min(C[i−1],J[i−1])+h[i] - 情况2:到达第i层的方式是跳:
也许从i-1层跳或者i-2层跳, 同时到达i-1层或i-2层的方式必须是爬,两者时间选择较小者,即:
J [ i ] = m i n ( C [ i − 1 ] , C [ i − 2 ] ) \bm { J[i] = min (C[i-1], C[i-2]) } J[i]=min(C[i−1],C[i−2])
最后在 C [ n ] C[n] C[n] 和 J [ n ] J[n] J[n] 中选最小者作为结果
6、参考Python代码
n=int(input('输入塔的层数:'))
C=[0]*(n+1)
J=[0]*(n+1)
for i in range(1,n+1):
h=int(input('这层的高度:'))
C[i]=min(C[i-1],J[i-1])+h
if i==1:
continue
J[i]=min(C[i-1],C[i-2])
print('最短时间:',min(C[-1],J[-1]))
二、妞妞的问题
1、题目描述:
妞妞公主得到了一块黑白棋盘。这块棋盘共有n行m列,任意相邻的两个格子都是不同的颜色(黑与白),坐标(1,1)的格子是白色的。
这一天牛牛来看妞妞公主时,牛牛公主正望着棋盘发呆。牛牛看妞妞公主闷闷不乐的样子,便对妞妞公主说:“只要你告诉我n和m,我能马上算出黑色方块的白色方块的数量。”
“这太简单了。”妞妞公主想了一会,“我会在这n行m列中选择一个左下角坐标位(x0,y0)。右上角坐标为(x1,y1)的矩形,把这个矩形里的共(x1-x0+1)*(y1-y0+1)个方块全部涂白。你还能马上算出黑色方块和白色方块的数量吗?”
“这太简单了。”牛牛自信一笑,“你还可以在执行涂白操作后再选择一个左下角坐标为(x2,y2),右上角坐标为(x3,y3)的矩形,把这个矩形里的方块全部涂黑。我依然能马上算出黑色方块和白色方块的数量.”
妞妞公主终于惊讶地睁大了眼睛,于是抛出了她的T次提问。
聪明的牛牛当然会做了,但是他想把这个问题交给你,请帮牛牛算出每次提问棋盘的黑白方块数目吧。
2、输入描述:
第一行一个整数T,表示妞妞公主一共提问了T次。
接下来3T行,
第(1+3i)行两个整数n,m。表示第i次提问时棋盘的大小;
第(2+3i)行四个整数x0,x1,y0,y1。表示第i次提问时涂白操作选取的两个坐标。
第(3+3i)行四个整数x2,y2,x3,y3。表示第i次提问时涂黑操作选取的两个坐标。
1<=T<=10000,1<=x<=n<=1000000000,1<=y<=m<=1000000000,x0<=x1,y0<=y1,x2<=x3,y2<=y。
3、输出描述:
共T行,每行两个整数分别表示白色方块的数量和黑色方块的数量。
4、例如
输入:
3
1 3
1 1 1 3
1 1 1 3
3 3
1 1 2 3
2 1 3 3
3 4
2 1 2 4
1 2 3 3
输出:
0 3
3 6
4 8
5、解题思路:
用0,1分别表示白和黑;用一个0-1矩阵表示棋盘,棋盘的奇数行初始都是0,1,0,1,…,偶数行相反1,0,1,…(表示任意相邻的两个格子都是不同的颜色),每次提问就是更新一次矩阵。
例如:上述疑问
- [0,1,0]———> [0,0,0]———> [1,1,1]——>白:0,黑:3
- [0,1,0]———> [0,0,0]———> [0,0,0]
[1,0,1]———> [0,0,0]———> [1,1,1]
[0,1,0]———> [0,1,0]———> [1,1,1]——>白:3,黑:6
(1) 初始时,也就是一开始黑白格子的个数:如果n*m(总数)为偶数,则黑白一样,若为奇数,则白色个数比黑色多一个。
(2) 坐标(x,y)的和x+y为奇数时,该位置是黑格子
6、参考Python代码
T=int(input('提问次数:'))
t=1
while t<=T:
n,m=input('行和列数:').split()
n,m=int(n),int(m)
x0,y0,x1,y1=input('涂白的坐标:').split()
x0,y0,x1,y1=int(x0),int(y0),int(x1),int(y1)
x2,y2,x3,y3=input('涂黑的坐标:').split()
x2,y2,x3,y3=int(x2),int(y2),int(x3),int(y3)
'''首先计算没涂之前的黑白块个数
'''
black=(m*n)//2
white=m*n-black
'''第一步将(x0,y0),(x1,y1)矩形内的方块都涂白,也就是计算出黑方块的个数d,
将白方块个数+d,黑方块-d
'''
if (x0+y0)%2==1:#涂白的起始坐标是黑格子
d=((x1-x0+1)*(y1-y0+1)+1)//2
else:
d=(x1-x0+1)*(y1-y0+1)//2
white+=d
black-=d
'''第一步将(x2,y2),(x3,y3)矩形内的方块都涂黑,也就是计算出白方块的个数d,
将白方块个数-d,黑方块+d
'''
if (x2+y2)%2==0:
d=((x3-x2+1)*(y3-y2+1)+1)//2
else:
d=(x3-x2+1)*(y3-y2+1)//2
white-=d
black+=d
'''第三步,找到两个矩形的公共部分'''
a=max(x0,x2);
b=max(y0,y2);
c=min(x1,x3);
d=min(y1,y3);
if c<a or d<b: #没有公共部分
e=0
else:
if (a + b) % 2 == 1:
e = ((c - a + 1) * (d - b + 1) + 1) // 2
else:
e = ((c - a + 1) * (d - b + 1)) // 2
white -= e
black += e
print(white,' ',black)
三、 小Q的最小值序列
1、题目描述:
小Q得到了一个长度为n的序列A,A中的数各不相同。对于A中的每一个数
A
i
A_i
Ai,求:
这道题没有得到完整的题目,所以。。。。