栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

蓝桥杯备战Day6 2022.3.4

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯备战Day6 2022.3.4

试题 历届真题 双向排序【第十二届】【省赛】【A组】

这题看题目都看了好久,解法其实不难,但我只能完成60%,python运行的太慢了,老是超时,恰个烂分算了。

需要注意的就是怎么对指定列表范围进行排序。

a = input().split()
n = int(a[0])
m = int(a[1])

xulie = [i+1 for i in range(n)]

for i in range(m):
    b = input().split()
    leixing = int(b[0])
    canshu = int(b[1])
    if leixing == 0:
        xulie = sorted(xulie[:canshu],reverse=True) + xulie[canshu:]
    else:
        xulie = xulie[:canshu-1] + sorted(xulie[canshu-1:])

for x in xulie:
    print(x,end=' ')

试题 历届真题 左孩子右兄弟【第十二届】【省赛】【A组】

树早忘完了,比赛时候遇到这题摆烂算了

网上找了别人的代码,仔细看了一遍,起码学会了python怎么构造树,后面看看遇到类似题对比着练习一下吧

class node:
    def __init__(self,val):
        self.val = val
        self.child = []

n = int(input())
tree = [None,node(val = 0)]
for i in range(2,n+1):
    print(tree)
    m = int(input())
    tree.append(node(val = m))
    tree[m].child.append(i)

def maxlen(n:node):
    if len(n.child):
        return len(n.child) + max(maxlen(tree[tmp]) for tmp in n.child)
    return 0
print(maxlen(tree[1]))

卡片

【问题描述】
小蓝有很多数字卡片,每张卡片上都是数字0到9

小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。

小蓝想知道自己能从1拼到多少。

例如,当小蓝有30张卡片,其中0到9各3张,则小蓝可以拼出1到10,但是拼11时卡片1已经只有一张了,不够拼出11

现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1拼到多少?

提示:建议使用计算机编程解决问题。

这题动手在草稿纸上画一画,会发现最先用完的总是1。因此,遍历数字到1用完为止

count = 0
for i in range(9999):
    num = str(i)
    count = count + num.count('1')
    if count > 2021:
        print(i-1)
    elif count == 2021:
        print(i)
        break
        
    
    

结果:3181


直线
【问题描述】
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。

给定平面上2×3个整点{ ( x , y ) | 0 ≤ x < 2 , 0 ≤ y < 3 , x ∈ Z , y ∈ Z } , 即横坐标是0到1(包含0和1)之间的整数、纵坐标是0到2(包含0和2)之间的整数的点。这些点一共确定了11条不同的直线。

给定平面上20×21个整点{ ( x , y ) | 0 ≤ x < 20 , 0 ≤ y < 21 , x ∈ Z , y ∈ Z},即横坐标是0到19(包含0和19)之间的整数、纵坐标是0到20(包含0和20)之间的整数的点。请问这些点一共确定了多少条不同的直线。

这题要注意两点:

一是如何判断是否为同一直线,需要通过斜率和截距两个维度判断

二是如何处理斜率无穷大的直线,在代码中可以先不处理这些直线,最后输出结果时加上x坐标集合的长度即可。比如{ ( x , y ) | 0 ≤ x < 20 , 0 ≤ y < 21 , x ∈ Z , y ∈ Z},只有20条斜率无穷大的直线,因此最后加上20就好。

x = [i for i in range(0,20)]
y = [i for i in range(0,21)]

# 斜率: k = (y2 - y1) / (x2 - x1)
# 截距:b = - k * x1 + y1 = (x2 * y1 - x1 * y2) / (x2 - x1)

def kkk(p1,p2):
    k = (p1[1]-p2[1])/(p1[0]-p2[0])
    return k

# 构造点集
point = []
for i in range(len(x)):
    for j in range(len(y)):
        point.append([x[i],y[j]])
        
# 构造一个集合存放斜率和截距,集合自带查重
n = set()
for i in range(len(point)):
    for j in range(len(point)):
        if point[i][0] == point[j][0]:
            continue
        k = kkk(point[i],point[j])
        b = (point[i][0]*point[j][1] - point[j][0]*point[i][1])/(point[i][0]-point[j][0])
        if (k,b) not in n:
            n.add((k,b))


print(len(n) + len(x))

结果:40257

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755602.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号