2020年4月30日——Python
1.解题时,如果题目中的条件太紧,限制的太多,可以暂时忽略掉,根据题意,求出一般的数据模型时再去解题;相反的,如果题目中的条件太松,基本上没有什么太多的限制,可以适当的增加一些条件,等求出一般的数据模型时再去解题。
2.编写完dfs (深度优先搜索)时出现错误,如果觉得使用debug一步一步的去检查太麻烦,可以在程序中创建一个路径,将遍历的路径输出出来,这样会方便很多。
3.并不是所有的题都适合用暴力方法解决。
例如:长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
这道题就不适合使用暴力方法解决。如果使用暴力方法去模拟感冒的蚂蚁,那就可能性太多了,很难实现,就算是实现出来,那程序对时间和空间的消耗是十分可怕的,所以 得换一条思路。
根据题意,去找题目中隐藏的规律:
其中,箭头代表为蚂蚁,橘色的代表感冒的蚂蚁,经过模拟这几只蚂蚁到达杆子的两端时,可以发现:
经过这样的分析,这道题,就可以很好的进行解决了。
4.python中可以使用numpy库来进行创建数组:
1 import numpy as np 2 a=np.zeros((2,2))#创建二维(维度分别为2,2)的全零数组 3 c=np.arange(10000).reshape((10,10,10,10))#创建四维的0~9999的数组,其中(10,10,10,10)代表shape,指的是四维数组的各个维度,而10000就代表着0~9999
5.求斐波那契数列:
定义:f(x)=1 ...(x=1,2)
f(x)=f(x-1)+f(x-2) ...(x>2)
(1)用代码直接实现:
1 n=int(input())#一直求到f(n) 2 a,b=1,1#代表着f(1)和f(2) 3 for i in range(3,n+1): 4 t=a 5 a=b 6 b+=t 7 print(b)#f(n)=b
思路是:
(2)使用快速幂:
斐波那契数列有一个特性:
通过上述公式,可以演变出:
使用这个方法实现程序,可以显著的提升时间性能,代码如下:
1 def mul(n,m):#将两个2*2的矩阵进行相乘 2 a=[[0,0],[0,0]] 3 a[0][0]=n[0][0]*m[0][0]+n[0][1]*m[1][0] 4 a[0][1]=n[0][0]*m[0][1]+n[0][1]*m[1][1] 5 a[1][0]=n[1][0]*m[0][0]+n[1][1]*m[1][0] 6 a[1][1]=n[1][0]*m[0][1]+n[1][1]*m[1][1] 7 return a 8 def mPow(n,m):#求n的m次幂 9 a=[]#用来存储m的二进制数 10 for i in bin(m).lstrip('0b'): 11 a.append(i) 12 e=[[1,0],[0,1]]#单位矩阵 13 for i in reversed(a): 14 if (int(i) and 1)==1: 15 e=mul(e,n) 16 n=mul(n,n)#按平方倍增 17 return e 18 def fib(n):#计算f(n) 19 a=[[1,1],[0,0]]#f(1)和f(2) 20 b=[[1,1],[1,0]] 21 c=mul(a,mPow(b,n-2)) 22 return c[0][0] 23 24 n=int(input())#求f(n) 25 """ 26 #第一种方法 27 a=1 28 b=1 29 t=0 30 if n[1]>=(n[0]+2): 31 for i in range(3,n[0]+3): 32 t=a 33 a=b 34 b+=t 35 print(b%n[2]-1) 36 else:#m<n 37 fibm=0 38 for i in range(3,n[0]+3): 39 t=a 40 a=b 41 b+=t 42 if i==n[1]: 43 fibm=b 44 print(b%fibm%n[2]-1) 45 """ 46 #第二种方法 47 print(fib(n))