【蓝桥杯训练】第三天1264

1264

在2行5列的格子中填入1到10的数字。
要求:相邻的格子中的数,右边的大于左边的,下边的大于上边的。
如下图所示的2种,就是合格的填法。
请你计算一共有多少种可能的方案。

输出
请输出该整数,不要输出任何多余的内容

注意

右下大

算法

  1. 为方便算法,将数字都-1,那么首先0,9确定在左上角和右下角。
  2. 把其看成一排,i与i+5比较即可
  3. array[4]可以不用处理
  4. 0-3,比较位置i,i+1,以及i,i+5大小
  5. 5-8,比较位置i,i+1大小

题解

答案:42

from itertools import permutations
def f(data):
    for i in range(9):
        if i == 4:
            continue
        if not i//5:
            if data[i] < data[i+5] and data[i] < data[i+1]:
                continue
            else:
                break
        else:
            if data[i] < data[i+1]:
                continue
            else:
                break
    if i == 8:
        return True

array = [i for i in range(10)]
res = 0
for i in permutations(array[1:-1]):
    array[1:-1] = i
    if f(array):
        res += 1
print(res)

1276

[蓝桥杯2015决赛]机器人繁殖

X星系的机器人可以自动复制自己。它们用1年的时间可以复制出2个自己,然后就失去复制能力。
每年X星系都会选出1个新出生的机器人发往太空。也就是说,如果X星系原有机器人5个,
1年后总数是:5 + 9 = 14
2年后总数是:5 + 9 + 17 = 31
如果已经探测经过n年后的机器人总数s,你能算出最初有多少机器人吗?
输入
输入存在多组测试数据
对于每组测试数据,输入一行两个数字n和s,用空格分开,含义如上。n不大于100,s位数不超过50位。
输出
对于每组测试数据,要求输出一行,一个整数,表示最初有机器人多少个。
样例输入 Copy
2 31
97 2218388550399401452619230609499
样例输出 Copy
5
8

注意

s的值最大有50位,map()中不能使用long,然而python2.2以后,当int存储溢出,会将其自动转换成long类型数值

算法

第n年忘记+x了,记得补上

扩展:假如已知n,s(n为年份,x为初始数),求经过n年后的机器人总数s

  1. 利用递归可以很好的计算出来s

题解

def f(n,s):
    up = s + 2**(n+1)-2-n
    return up//(2**(n+1)-1)
while True:  
    n, s = map(int,input().split())
    print(f(n,s))

扩展题解:

def f(n,x):
    if n == 0:
        return x
    return f(n-1,2*x-1)+x
while True:  
    n, s = map(int,input().split())
    print(f(n,x))
posted @ 2020-01-19 23:51  燕山北  阅读(281)  评论(0编辑  收藏  举报