0
点赞
收藏
分享

微信扫一扫

【每日一题】备战冲击蓝桥杯国赛——Python程序设计 | Day13 | 货物摆放 | 真题代码解析


每天刷一道题,话不多说,先刷近两年的题吧,现在是2021年的真题了,如果有一起的可以加入我们!!!

一起来刷题,冲击国赛!!!


扫码 我的主页 网页左边下方 群二维码

加入方式:可以在下方的微信名片加我,然后拉你入群。(记得备注暗号我要拿国奖


2021年第十二届蓝桥杯赛题总览

2020年的题就是这些,类型分为两种,分别是结果填空和程序设计,我们每天刷一道题,省赛没问题!
在这里插入图片描述

直线 (题目)

(本题总分:5分)

官方练习系统:https://www.lanqiao.cn/problems/1463/learning/


—>【问题描述】

在这里插入图片描述

—>【结果描述】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


解析


通过阅读题干,本题——难度一般:⭐⭐

考察类型:枚举、数论

考察知识点:集合set()


分析:


代码

Python代码实现:
法一:(极不推荐)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/3/7 14:51
# @Author  : 府学路18号车神
# @Email   :yurz_control@163.com
# @File    : Day13.py

import time

n = 2021041820210418          # 2021041820210418
L,W,H = 0,0,0       # 设置长宽高的初值
docker = set()      # 设置一个容器

start_time = time.time()
# while length <= 16:      # 当长度不超过16时,可继续计算
for i in range(1, n+1):
    L = i               # 赋值长
    if n % L == 0:      # 如果n除以长能出清,那么继续运行下去,这样可以减少后面的迭代次数
        n1 = n/L        # 先把L给去除了,然后剩下的就是W和H了
        for j in range(1, n+1):
            W = j           # 赋值宽
            if n1 % W == 0:     # 和上面同理,为了判断是否能整除
                n2 = n1/W

                H = n2          # 实际此时的n2就是最终的高H,这样我们只需要两层迭代就可以解决啦
                nn = L*W*H
                print(int(nn), (L,W,H))
                if int(nn) == n:     # 再次判断最终的相乘结果是否为n
                    docker.add((L,W,H))     # set集合中不会出现重复的
end_time = time.time()
print("运算时间为:", end_time-start_time)
print(len(docker))      # 计算容器的长度也就是最终方案的次数:2430

法二:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/3/7 16:03
# @Author  : 府学路18号车神
# @Email   :yurz_control@163.com
# @File    : demo.py

from math import sqrt

a = 0   # 计数器
n = 2021041820210418
s = list()      # 存放临时值

for i in range(1, int(sqrt(n))+1):      # 求取n的平方,取出中值
    if n%i==0:                          # 然后再计算一下可否整除n,如果能就加入到list中备用
        s.append(i)                     # 先加入第一个i,后加入被除数,这样就得到了两个值,可能是长宽高中任意的两个
        s.append(n/i)

for i in s:                             # 三层取出相乘
    for j in s:
        for k in s:
            if i*j*k ==n:
                a += 1
print(a)        # 2430,控制台运行还是超时,自闭了

在这里插入图片描述
法三:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/3/7 16:03
# @Author  : 府学路18号车神
# @Email   :yurz_control@163.com
# @File    : demo.py

from math import sqrt

a = 0   # 计数器
n = 2021041820210418
s = list()      # 存放临时值
docker = set()
L,W,H =0,0,0

for i in range(1, int(sqrt(n))+1):      # 求取n的平方,取出中值
    if n%i==0:                          # 然后再计算一下可否整除n,如果能就加入到list中备用
        s.append(i)                     # 先加入第一个i约数,后加入被除数,这样就得到了两个值,可能是长宽高中任意的两个
        s.append(n/i)

# for i in s:                             # 三层取出相乘
#     for j in s:
#         for k in s:
#             if i*j*k ==n:
#                 a += 1

for x in s:
    L = x           # 取出付给L
    for y in s:
        W = y       # 取出值赋给W
        if n % (L*W) == 0:
            H = n/(L*W)
            nn = L*H*W
            a += 1
            # if int(nn) == n:
            #     docker.add((L,H,W))

print(a)        # 2430,控制台运行还是超时,自闭了

在这里插入图片描述

5s不到就运算出来了,不知道为什么还是超出时间限制,估计是因为Python内部机制的原因,计算太慢了,Java和C++还是很快的,emo了,目前只能这样了,填空题,能算出来就行了~

可以得出最终的结果为:2430

由此,我们可以快速得出结果,验证完毕!


今天开刷第 十三 天,难度一般,欢迎大家加入,一起变强,一起自律,一起上国赛!!!

今天的题目一般哈,有不同解法的可以在下面留言哦!~

往期刷题路线:

刷题路线Detail
2020年
Day-01门牌制作
Day-02寻找2020
Day-03跑步锻炼
Day-04蛇形填数
Day-05排序
Day-06装饰珠
Day-07成绩统计
Day-08单词分析
Day-09数字三角形
Day-10平面切分
2021年
Day-11卡片
Day-12直线

官方刷题练习系统:http://lx.lanqiao.cn/


ღ( ´・ᴗ・` )

举报

相关推荐

0 条评论