蓝桥杯【Python组】备战算法专题+例题

枚举

  • 枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能
    枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。
    • 确定所有可能的情况
    • 有序的列举
    • 尽早排除不是解的情况
  • POJ 1543 完美立方
    时限: 1000MS 内存限制: 10000K
    提交总数: 17965 接受的: 8944
    描述
    数百年来,费马最后定理简单地证明了:对于n> 2,不存在整数a,b,c> 1,因此a ^ n = b ^ n + c ^ n仍然难以捉摸。(尽管仍在进行审查,但最新的证明被认为是正确的。)但是,可以找到大于1的整数,这些整数满足“完美立方”方程a ^ 3 = b ^ 3 + c ^ 3 + d ^ 3(例如,快速计算将显示等式12 ^ 3 = 6 ^ 3 + 8 ^ 3 + 10 ^ 3确实是正确的)。这个问题要求您编写一个程序来查找所有满足<= N的等式的数字集{a,b,c,d}。
    输入项
    一个整数N(N <= 100)。
    输出量
    输出应如下所示列出,每行一个完美的多维数据集,以a的降序排列(即,各行应按其a值排序)。b,c和d的值也应以不降序排列在行本身上。确实存在几个可以从b,c和d三元组的多个不同集合中产生的a值。在这些情况下,应首先列出b值较小的三元组。
    样本输入
    24
    样本输出
    立方体= 6,三重=(3,4,5)
    立方体= 12,三重=(6,8,10)
    立方体= 18,三重=(2,12,16)
    立方体= 18,三重=(9,12,15)
    立方体= 19,三重=(3,10,18)
    多维数据集= 20,三重=(7,14,17)
    立方体= 24,三重=(12,16,20
n = int(input())
l = [0]
for i in range(1,n+1):
    a = pow(i,3)
    l.append(a)
for a in range(2,n+1):
    for b in range(2,a):
        for c in range(b,a):
            for d in range(c,a):
                if(l[a] == l[b] + l[c] + l[d]):
                    print("Cube = %d, Triple = (%d,%d,%d)"%(a,b,c,d))
  • POJ 1006
    描述
    有人认为,一个人的生命从出生的那一天开始就有三个周期。这三个周期是身体,情感和智力周期,分别为23天,28天和33天。在一个周期的每个周期中都有一个峰值。在一个周期的高峰期,一个人在相应的领域(身体,情感或精神)上表现最佳。例如,如果这是心理曲线,则思维过程将更清晰,专心将更容易。
    由于三个周期的周期不同,因此三个周期的峰值通常出现在不同的时间。我们想确定任何人何时发生三重峰(所有三个周期的峰均在同一天出现)。对于每个周期,将从当前年份开始的天数,其中出现一个高峰(不一定是第一个高峰)。您还将获得一个日期,表示为从当年年初开始的天数。您的任务是确定从给定日期到下一个三重高峰的天数。给定的日期不计算在内。例如,如果给定的日期是10,而下一个三重高峰发生在第12天,则答案是2,而不是3。如果在给定的日期中出现了三重高峰,则应指定下一次出现a的天数三重峰。
    输入项
    您会收到许多案例。每种情况的输入均由一行包含四个整数p,e,i和d的行组成。值p,e和i分别是从当年年初开始的身体,情绪和智力周期达到顶峰的天数。值d是给定的日期,可以小于p,e或i中的任何一个。所有值均为非负值,最多365,并且您可以假定在给定日期的21252天内将出现三重峰值。输入的结尾由一行表示,其中p = e = i = d = -1。
    输出量
    对于每个测试用例,以以下格式打印案例编号,然后显示一条消息,指示到达下一个三重高峰的天数:
    案例1:下一个三重高峰发生在1234天。
    即使答案为1,也应使用复数形式``天’’。
    样本输入
    0 0 0 0
    0 0 0 100
    5 20 34 325
    4 5 6 7
    283 102 23 320
    203301203 40
    -1 -1 -1 -1
    样本输出
    情况1:下一个三重高峰发生在21252天。
    情况2:下一个三重高峰发生在21152天。
    情况3:下一个三重高峰发生在19575天。
    情况4:下一个三重高峰发生在16994天。
    情况5:下一个三重高峰发生在8910天内。
    情况6:下一个三重高峰发生在10789天。
a,b,c,d = map(int,input().strip().split())

def w(a,b,c,d):
    for i in range(d+1,21253):
        if((i-a)%23 == 0):
            for j in range(i,21253,23):
                if((j-b)%28 == 0):
                    for x in range(j,21253,23*28):
                        if((x-c)%33 ==0):
                            return x-d

print(w(a,b,c,d))

  • POJ 1017
    描述

    工厂生产的产品包装成高度为h且尺寸为1 * 1、2 * 2、3 * 3、4 * 4、5 * 5、6 * 6的方包。这些产品始终以与产品相同高度h且尺寸为6 * 6的方形包裹交付给客户。由于费用的关系,工厂和客户的利益就是将从工厂向客户交付订购产品所需的包裹数量最小化。一个好的程序可以解决查找根据订单交付给定产品所需的最小包裹数的问题,这可以节省很多钱。要求您制作这样的程序。
    输入项

    输入文件由几行指定顺序组成。每一行指定一个订单。顺序用六个整数描述,每个整数之间用一个空格分隔,这些整数依次表示从最小大小1 * 1到最大大小6 * 6的各个大小的数据包数量。输入文件的末尾由包含六个零的行指示。
    输出量

    输出文件在输入文件的每一行中包含一行。该行包含可打包输入文件相应行中的订单的最小宗数。输出文件中没有与输入文件的最后一个``空’'行相对应的行。
    样本输入

    0 0 4 0 0 1
    7 5 1 0 0 0
    0 0 0 0 0 0
    样本输出

    2
    1个

a, b, c, d, e, f = map(int, input().strip().split())
x = 0
y = 0
z = 0
yc = [0, 5, 3, 1]
zc = [0, 7, 6, 5]

while(not a==b==c==d==e==f):
    x = f + e + d + (c+3)//4
    y = d * 5 + yc[c%4]
    z = e * 11 + zc[c%4]
    if(b>y):
        k = ((b-y)+8)//9
        x += k
        z += (k*9+y-b)*4
    else:
        z += (y-b)*4
    if(a>z):
        k = ((a-z)+35)//36
        x += k

    print(x)
    a, b, c, d, e, f = map(int, input().strip().split())
  • 填写运算符
    输入五个数5 5 5 5 5,在其中间填入四个运算符+ - * /,使其结果等于5
A = ['+','-','*','/']
count = 0
for i in range(4):
    for j in range(4):
        for k in range(4):
            for h in range(4):
                if (eval('5'+A[i]+'5'+A[j]+'5'+A[k]+'5'+A[h]+'5') == 5):
                    count += 1
                    print(str(count) + '、5'+A[i]+'5'+A[j]+'5'+A[k]+'5'+A[h]+'5')


排序

搜索

计数

贪心

动态规划

图论

数论

博弈论

概率论

计算几何

字符串算法

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值