Advertisement

【蓝桥杯python组】【2021年第十二届省赛填空题】【1】

阅读量:

已有近9个月未曾对博客进行更新
这段时间略感懒散 假期恰是最佳创作时机
最近博客内容主要聚焦于蓝桥杯Python组相关内容的更新 期待您的关注与支持

小蓝拥有一批数字卡片,在每张卡片上都标有从0到9的数字。为了系统地构建一系列整数序列,他打算利用这些卡片来生成所有可能的正整数值。具体来说,在生成每一个新的数值后就将其记录下来,并将这些已使用的卡片移除出可用范围以避免重复使用。基于当前的情况,在手头拥有数量充足的资源(即每种数字各有2021张)的情况下,请问他最多能连续拼出多少个正整数值?

答案:3181

解题思路:本题的解题思路聚焦于列表的设置以及对每个数字的拆分。

复制代码
    a = [2021 for i in range(10)]#初始化
    def check(x):
    while(x > 0):
        now = int(x % 10)
        if(a[now] > 0):
            a[now] -= 1
        else:
            return 0
        x = x // 10
    return 1
    
    cnt = 1
    while(check(cnt)):
    cnt += 1
    print(cnt - 1)#X+1无法拼凑但是countnum已经加一,所以这里要减一噢

在平面直角坐标系中,两个不同的点可以唯一决定一条直线。当多个点位于同一直线上时,则这些点中任意两个不同的点所决定的直线是完全重合的。
给定平面上由2×3个整点构成的集合{(x, y)|0 ≤ x < 2且0 ≤ y < 3且x∈Z且y∈Z}(即横坐标为0到1之间的整数、纵坐标为0到2之间的整数),这些整点共同形成了11条互不相同的直线。
那么由这20×21个整点所形成的集合能够生成多少条互不相同的直线呢?

解题思路:本道题的一个难点在于当点的数量较少且结构较为简单时(容易导致解题者忽视),特别是在结构较为复杂的情况下(这时就需要关注),需要特别注意斜率k以及截距d来区分是否是同一条直线

答案:40257

复制代码
    #方法一:这种方法实际上比较复杂
    import os
    import sys
    
    class Line(object): #直线类
    
    def __init__(self): #初始化
        self.k = 0
        self.b = 0
    
    def __lt__(self, t):#sort函数的调用
        if self.k != t.k:
            return self.k < t.k
        return self.b < t.b
    
    
    N = 200000
    n = 0
    l = [Line() for _ in range(N)]  #每个list存放Line类
    
    for x1 in range(0, 20):
    for y1 in range(0, 21):
        for x2 in range(0, 20):
            for y2 in range(0, 21):
                if x1 != x2:  #为了避免斜率不存在的情况
                    k = float((y2 - y1)) / (x2 - x1)
                    b = float(y2 - k * x2)
    
                    l[n].k = k
                    l[n].b = b
                    n += 1
    L = l[0: n]
    L.sort()
    res = 1
    for i in range(1, n): #比较
    if abs(L[i].k - L[i - 1].k) > 1e-8 or abs(L[i].b - L[i - 1].b) > 1e-8:
        res += 1
    print(res + 20) #加上斜率不存在的情况
复制代码
    #方法二:考虑到set集合的特性,这里使用集合去重
    xlist=[i for i in range(20)]
    ylist=[i for i in range(21)]
    points=[(x,y) for x in xlist for y in ylist]
    s=set();
    
    def getline(p,q):
      k=(q[1]-p[1])/(q[0]-p[0])
      b=q[1]-q[0]*k;
      return round(k,8),round(b,8)
    
    for p in points:
      for q in points:
    if p!=q and p[0]!=q[0]:
      s.add(getLine(p,q))
    
    print(len(s)+20)

蓝桥杯python组

这篇文章将在本节结束时发布完毕!随后发布的关于2021年省赛填空题的相关链接将会放置在以下位置:

蓝桥杯python组

如有错误之处还请多多指教~

全部评论 (0)

还没有任何评论哟~