2024年春季学期《算法分析与设计》练习6

while True:
    n = int(input())
    arr = [5] * n
    for i in range(1, n):
        if i % 2 == 0:
            arr[i] = 2 * arr[i - 1] + 2
        else:
            arr[i] = 2 * arr[i - 1] - 2
    print(sum(arr))

 简单的找规律问题

 

 

 

while True:
    t = int(input())
    for i in range(t):
        print(bin(int(input()))[2:].count('1'))

 

 

while True:
    import random
 
 
    def partition(arr, p, q):
        x = arr[p]
        i = p
        for j in range(p + 1, q + 1):
            if arr[j] <= x:
                i += 1
                arr[i], arr[j] = arr[j], arr[i]
        arr[i], arr[p] = arr[p], arr[i]
        return i
 
 
    def quickselect(arr, s, t, k):
        if s == t:
            return arr[s]
        i = partition(arr, s, t)
        j = i - s + 1
        if k == j:
            return arr[i]
        elif k < j:
            return quickselect(arr, s, i - 1, k)
        else:
            return quickselect(arr, i + 1, t, k - j)
 
 
    def randomizedselect(arr, s, t, k):
        if s == t:
            return arr[s]
        i = randomizedpartition(arr, s, t)
        j = i - s + 1
        if k == j:
            return arr[i]
        elif k < j:
            return randomizedselect(arr, s, i - 1, k)
        else:
            return randomizedselect(arr, i + 1, t, k - j)
 
 
    def rand(p, q):
        return random.randint(p, q)
 
 
    def randomizedpartition(arr, p, q):
        r = rand(p, q)
        arr[p], arr[r] = arr[r], arr[p]
        return partition(arr, p, q)
 
 
    k = int(input())
    arr = list(map(int, input().split()))
    print(randomizedselect(arr, 0, len(arr) - 1, len(arr) - k+1))

第K大数就是第len(arr)-k小数

 

def chessboard(tr, tc, dr, dc, size):
    global num
    if size == 1:
        return
    s = size // 2
    num += 1
    t = num
    if dr < tr + s and dc < tc + s:
        chessboard(tr, tc, dr, dc, s)
    else:
        arr[tr + s - 1][tc + s - 1] = t
        chessboard(tr, tc, tr + s - 1, tc + s - 1, s)
    if dr >= tr + s and dc < tc + s:
        chessboard(tr + s, tc, dr, dc, s)
    else:
        arr[tr + s][tc + s - 1] = t
        chessboard(tr + s, tc, tr + s, tc + s - 1 + s, s)
    if dr < tr + s and dc >= tc + s:
        chessboard(tr, tc + s, dr, dc, s)
    else:
        arr[tr + s - 1][tc + s] = t
        chessboard(tr, tc + s, tr + s - 1, tc + s, s)
    if dr >= tr + s and dc >= tc + s:
        chessboard(tr + s, tc + s, dr, dc, s)
    else:
        arr[tr + s][tc + s] = t
        chessboard(tr + s, tc + s, tr + s, tc + s, s)
 
 
while True:
    n = int(input())
    num = 0
    arr = []
    p = 0
    q = 0
    for i in range(n):
        arr.append(list(map(int, input().split())))
        if -1 in arr[-1]:
            for j in range(n):
                if arr[-1][j] == -1:
                    p = i
                    q = j
    chessboard(0, 0, p, q, n)
    for i in range(n):
        print(*arr[i])

 

 

 

def digui(x, y, n):
    if n == 1:
        return x * y
    elif x == 0 or y == 0:
        return 0
    else:
        a = x // pow(10, n / 2)
        b = x % pow(10, n / 2)
        c = y // pow(10, n / 2)
        d = y % pow(10, n / 2)
        ac = digui(a, c, n / 2)
        bd = digui(b, d, n / 2)
        abcd = digui(a - b, d - c, n / 2) + ac + bd
        return int(ac * pow(10, n) + abcd * pow(10, n / 2) + bd)
 
 
while True:
    x, y = map(str, input().split())
    sign = str(x).count('-') + str(y).count('-')
    len1 = max(len(x), len(y))
    x += (len1 - len(x)) * '0'
    y += (len1 - len(y)) * '0'
    flag = 2 * len1 - len(x) + len(y)
    if len(x) % 2 != 0:
        x += '0'
        y += '0'
        flag += 2
    if sign % 2 == 0:
        print(digui(abs(int(x)), abs(int(y)), len(x)))
    else:
        print(-digui(abs(int(x)), abs(int(y)), len(x)))

 

 

 

mer = [[0] * 100 for i in range(100)]
 
 
def digui(n, m):
    if n < 1 or m < 1:
        return 0
    if n == 1 or m == 1:
        return 1
    if n < m:
        if mer[n][n] == 0:
            mer[n][n] = digui(n, n)
        return mer[n][n]
    if n == m:
        if mer[n][n - 1] == 0:
            mer[n][n - 1] = digui(n, n - 1)
        return mer[n][n - 1] + 1
    if mer[n][m - 1] == 0:
        mer[n][m - 1] = digui(n, m - 1)
    if mer[n - m][m] == 0:
        mer[n - m][m] = digui(n - m, m)
    return mer[n][m - 1] + mer[n - m][m]
 
 
while True:
    n = int(input())
    print(digui(n, n))

多加一个数组保存数据防止重复运算 

 

 

flag = 1
while True:
    m, n = map(float, input().split())
    if m > n:
        print('Case ' + str(flag) + ': Bigger')
    elif m < n:
        print('Case ' + str(flag) + ': Smaller')
    else:
        print('Case ' + str(flag) + ': Same')
    flag+=1

 

 

from itertools import *
 
while True:
    t = int(input())
    par_s = []
    par_g = []
    for i in range(t):
        s, a = map(str, input().split())
        a = int(a)
        par_s.append(s)
        par_g.append(a)
    m = int(input())
    b = list(map(int, input().split()))
    if m < t:
        for i in range(t - m):
            b.append(0)
    target = input()
    ans = []
    for elemt in permutations(b):
        c = par_g.copy()
        elemt = list(elemt)
        for i in range(t):
            c[i] += elemt[i]
        # print(c)
        c_sort = sorted(c)[::-1]
        for i in range(t):
            if par_s[i] == target:
                for j in range(t):
                    if c[i] == c_sort[j]:
                        ans.append(j)
    # print(ans)
    print(min(ans) + 1, max(ans) + 1)

时间爆炸了过不了

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值