【思特奇杯·云上蓝桥-算法集训营】第1周

1.跑步训练

energy = 10000
time = 0
while energy > 600:
    energy -= 300
    time += 2
print(round((time + energy/600)*60))

答案为 3880

2.阶乘约数

# 首先统计出所有的质数
ls = []
for i in range(2, 101):
    j = 2
    for j in range(2, int(i ** 0.5) + 1):
        if i % j == 0:
            break
    else:
        ls.append(i)
# 让每个质数初始值为1
dic = {}
for i in ls:
    dic[i] = 1

# 求出所有的质因数的数量
for i in range(2, 101):
    for j in ls:
        if j > i:
            break
        while i % j == 0:
            i /= j
            dic[j] += 1

# 最后连乘求出结果
res = 1
for i in dic.values():
    res *= i
print(res)

答案为:39001250856960000

3 出栈次序

def f(n):
    temp = 0
    if n == 0:
        temp += 1
    elif n == 1:
        temp += 1
    elif n == 2:
        temp += 2
    elif n == 3:
        temp += 5
    else:
        for i in range(0, n):
            temp += f(i)*f(n-1-i)
    return temp
print(f(16))

答案为35357670

4 哥德巴赫分解

def is_prime(n):
    if n < 2:
        return False
    if n == 2:
         return True
    else:
        for i in range(2, n):
            if n % i == 0:
                return False
        return True


def finding(m):
    for i in range(2, m//2 + 1):
        if is_prime(i) and is_prime(m-i):
            return min(i, m - i)


p = []
for i in range(4, 10001, 2):
    p.append(finding(i))
print(max(p))

答案为173

5.图书排列

import itertools
nums = [i for i in range(10)]
n = 0

def check(ls):
    for i in range(len(ls)-1):
        if abs(ls[i] - ls[i-1]) == 1:
            return False
    return True

for num in itertools.permutations(nums, 10):
    if check(num):
        n += 1

print(n)  

答案为479306

6.猴子分香蕉

for i in range(6, 10000):
   a = i
   if a%5 == 1:
       a = (a-1)/5*4
       if a%5 == 2:
           a = (a-2)/5*4
           if a%5 == 3:
               a = (a-3)/5*4
               if a%5 == 4:
                   a = (a-4)/5*4
                   if a%5 == 0 and a>0:
                       print(i)  # 3141
                       break

答案为3141

7.稍小分数

def fun(a, b):
    if b == 0:
        return a
    return fun(b, a % b)


N = int(input("请输入分子:"))
D = int(input("请输入分母:"))

dp = []
dq = []
for d in range(1, 101):
    for n in range(1, d):
        if (n/d) < (N/D) and fun(d, n) == 1:
            dp.append([n, d, n/d])
            dq.append(n/d)
for i in range(len(dp)):
    if dp[i][2] == max(dq):
        print(dp[i])

在这里插入图片描述

8.excel地址

n = int(input('请输入一个整数:'))
ans = []
while n!= 0:
    if n % 26 == 0:
        ans.append(26)
        n = n // 26 - 1
    else:
        ans.append(n%26)
        n = n // 26
for i in range(len(ans)):
	#加64把数字转化成字符,且是从列表最后向前打印
    print(chr(ans[len(ans)-i-1]+64), end='')

在这里插入图片描述
9.日期问题

while True:
    try:
        a = list(map(int, input().split("/")))
        res = []
 
 
        def isRN(year):
            if year % 4 == 0 and year % 100 != 0:
                return True
            elif year % 400 == 0:
                return True
            else:
                return False
 
 
        def f(x, y, z):  # 默认年月日
            if x >= 0 and x <= 59:
                x += 2000
            elif x >= 60 and x <= 99:
                x += 1900
            if y <= 0 or y > 12:
                return False
            if z <= 0 or z > 31:
                return False
 
            if isRN(x) and y == 2 and z > 29:
                return False
            if isRN(x) == False and y == 2 and z > 28:
                return False
            if y == 4 and z > 30:
                return False
            if y == 6 and z > 30:
                return False
            if y == 9 and z > 30:
                return False
            if y == 11 and z > 30:
                return False
            else:
                if y < 10:
                    y = str(0) + str(y)
                if z < 10:
                    z = str(0) + str(z)
                res.append(str(x) + "-" + str(y) + '-' + str(z))
                return
 
 
        f(a[0], a[1], a[2])
        f(a[2], a[0], a[1])
        f(a[2], a[1], a[0])
        for i in sorted(list(set(res))):
            print(i)
 
    except:
        break
    else:
        break



在这里插入图片描述
10.整数划分

def fun(n,a,k):
     if n <= 0:
         for i in range(k):
             print(a[i], end='')
         print()
         return
     for i in range(n, 0, -1):
        if k > 0 and i < a[k-1]:
            continue
        a[k] = i
        fun(n-i, a, k+1)
 
a = [0] * 100

fun(5, a, 0)
 

在这里插入图片描述
11.一步之遥

p = []
for i in range(10000):
    for n in range(10000):
        if (97*i - 127*n) == 1:
            p.append(i+n)
            break
print(min(p)) 

答案为 97

12.啦啦队问题

import math

def check():# 判断是否可以向上拓展
    a = 0
    b = 0
    tmp = row
    while tmp >0:
        for i in range(1, tmp+1):
            if cnt[i] == 1:
                a +=1
            else:
                b += 1
        for i in range(2, tmp+1):
            if cnt[i-1]==cnt[i]:
                cnt[i-1] = 1
            else:
                cnt[i-1] = 2
        tmp -=1
    if a == m and b == n:
        return True
    else:
        return False

def dfs(k):# 遍历所有第一排
    global res
    if k > row:
        if check():
            res +=1
        return
    cnt[k] = 1
    dfs(k+1)
    cnt[k] = 2
    dfs(k+1)

if __name__ == "__main__":
    m = int(input())
    n = int(input())
    res = 0
    cnt = [0 for _ in range(100010)]
    row = int(math.sqrt(2*(m+n)))
    dfs(1)
    print(res)


在这里插入图片描述
13.七星填空

import itertools


nums = [i for i in range(1, 15)]
nums.remove(6)
nums.remove(11)
nums.remove(14)
print(len(nums))


def check(ls):
    value = [0 for i in range(7)]
    value[0] = ls[0] + ls[1] + ls[2] + ls[3]
    value[1] = ls[1] + ls[10] + 20
    value[2] = ls[2] + ls[4] + 17
    value[3] = ls[5] + ls[7] + ls[9] + 11
    value[4] = ls[3] + ls[4] + ls[6] + ls[5]
    value[5] = ls[7] + ls[8] + ls[6] + 14
    value[6] = ls[0] + ls[9] + ls[10] + ls[8]
    for m in range(7):
        for n in range(7):
            if value[m] != value[n]:
                return False
    return True


for num in itertools.permutations(nums):
    if check(num):
       for i in range(4):
            print(num[i], end=" ")  # 10,3,9,8


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值