蓝桥杯真题训练8

蓝桥杯真题训练

1-等差数列

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N个整数。

现在给出这 N个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?

输入描述
输入的第一行包含一个整数 N。

第二行包含 N个整数 并不一定是按等差数列中的顺序给出)

a = int(input())
b = [int(a) for a in input().split(" ")]
c = sorted(b)
d = []
for f in range(1,len(c)):
    d.append(c[f]-c[f-1])

sum = 0
if min(d)==0:
    print(len(c))
else:
    for m in range(min(b),max(b)+1,min(d)):
        sum += 1
    print(sum)

解题思路:这里引用了风起云涌的代码。这题很简单,既然求最短,就是在这个数组最大和最小之间求,然后比每个数字之间的差,最小的差,就是符合最短的等差数列,里面注意的是有等差为0的数组。

2-受伤的皇后

有一个 n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n个受伤的国际象棋皇后,要求:

任何两个皇后不在同一行。
任何两个皇后不在同一列。
如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。

n=int(input())
map=[[0]*(n+2) for i in range(n+2)]
f=[0]*(n+2)

def dfs(m, l, map,f):
  global count
  if(l==n):
    count+=1
    return
  
  for i in range(1, n+1):
    if(abs(i-m)>1 and f[i]==0 and map[l][i-1]==0 and map[l][i+1]==0 and map[l+2][i-1]==0 and map[l+2][i+1]==0):
      f[i]=1
      map[l+1][i]=1
      dfs(i, l+1, map, f)
      f[i]=0
      map[l+1][i]=0

count=0
for i in range(1, n+1):
  f[i]=1
  map[1][i]=1
  dfs(i, 1,map,f)
  map[1][i]=0
  f[i]=0
print(count)

解题思路:这里引用了LOU3805123070的代码。思想还是用的是dfs,这题的关键是如何实现这种dfs。这里每个位置的复位都可以理解,我认为最关键的是abs(i-m)>1。if语句中的这句话,很巧妙地使斜对角的情况并且行相差3的情况放进去。还有作者在原本就开拓一圈的数组,使得首尾的情况一般化,非常巧妙。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值