👋蓝桥杯备战倒计时31天
👋快和小郑一起Python真题演练
题目来源:蓝桥云课
难度:⭐️
问题分析:显然是一道筛质数的题目,由于埃筛法上手容易效率也还行,从这个方法入手。
prime[i]:代表第i个质数是prime[i],isprime[i]:代表第i个数字是否为质数 (1或0表示)
cnt:计数器 用于关联到prime的下标
max=20210605 prime=[] is_prime=[1]*20210606 cnt=0 for i in range(2,max+1): if is_prime[i]: prime.append(i) j=2*i while j<=max: is_prime[j]=0 j+=i #prime保存了(2,20210605)的所有质数 cnt=len(prime)#接下来要去除不纯质数 for i in range(len(prime)): for j in str(prime[i]): if int(j) not in [2,3,5,7]: cnt-=1 break print(cnt)
上述代码已经pass,10s内出结果,暴力筛法有点慢,但也能出答案。
🍅最少砝码 题目来自蓝桥云课
难度:⭐️⭐️⭐️
问题分析:乍一看无从入手 那就尝试找找规律
根据题意 我们就是要以最少的砝码 通过加减构造出最大的一段连续区间
那就枚举几种情况:
当区间等于[1] 砝码只需要1个(重量为1)
当用两个砝码 (1,2)或者(1,3)
前者构造的区间为(1,3) 后者为(1,4) 显然后者更优
接着,如果两个砝码为(1,4) 那么将无法构成连续区间
所以两个砝码能够构造的最大区间为(1,4)
当用三个砝码(1,3,1),(1,3,2)...一直到(1,3,9)我们可以发现都能构造出连续区间
显然(1,3,9)更优 能够构造的连续区间为(1,13)
再来,(观察砝码重量),我们猜测,如果4个砝码重量分别是(1,3,9,27),那么能够构造出的最大连续区间为(1,40),这个是显然的,因为(1,3,9)已经能任意构造[1,13] 配上一个27,区间自然能扩到(1,40)
那么在细化,如果4个砝码重量分别是(1,3,9,n),n<27,那么能够,构造的连续区间和上面同理 为[1,13+n],显然(1,3,9,27)是最优的,符合预期。
因而我们猜测:当砝码重量以公比为3的数列排布时,会形成最优解.。
其中,当有n个砝码时,所能构成的最大区间为:[1,(3**n-1)/2]
(简单观察就能知道:[1],[1,4],[1,13],[1,40]可以看作[1],[1,1+3],[1,1+3+9],[1,1+3+9+27])
所以我们只需要找到第一个n使得(3**n-1)/2>=输入即可(代码已经PASS)
n=int(input()) t=1 while 3**t-1<2*n: t+=1 print(t)
灌溉 题目来自蓝桥云课
难度:⭐️⭐️⭐️
问题分析:maze[i][j]:代表经过maze[i][j]分钟(i,j)充满水
一开始初始化maze[i][j]为-1,0时刻就有的水管就需要赋值为0,即经过0分钟充满水
k=0 把maze中所有值为0的邻居都设置为1,代表其邻居在1分钟后满水
k=1 把maze中所有值为1的邻居都设为2,代表其邻居在2分钟后满水
k=n 把m把maze中所有值为k的邻居都设为k+1,代表其邻居在k+1分钟后满水
最后统计有几个值不等于-1的格子(也可以在每轮赋值邻居的值的时候就计数)
细节:不是所有邻居都要设,需要合法的邻居:不越界,未访问过(不等于-1)就行
代码已经Pass
n,m=map(int,input().split()) t=int(input()) maze=[[-1]*m for i in range(n)]#-1表示未访问 dx=[1,-1,0,0] dy=[0,0,1,-1] count=t for i in range(t): row,col=map(int,input().split()) maze[row-1][col-1]=0#已访问 k=int(input()) def judge(x,y): if 0<=x<=n-1 and 0<=y<=m-1 and maze[x][y]==-1: return True return False for i in range(0,k):#经过K分钟 for x in range(n): for y in range(m): if maze[x][y]==i: for _ in range(4): nx,ny=x+dx[_],y+dy[_] if judge(nx,ny): maze[nx][ny]=i+1 count+=1 print(count)
有任何不懂的可以在下面提问噢 !一起进步👍