【思特奇杯·云上蓝桥-算法集训营】 结营作业 python

题目来自 第十一届蓝桥杯 B组

第一题:门牌制作

er = 0

for i in range(1, 2021):
    a = list(str(i))
    er += a.count('2')

print(er)

结果:

第二题:既约分数

totle_amount=0
def func(a,b):
	x = a % b
	while (x != 0):
		a = b
		b = x
		x = a % b
	return b
for i in range(1,2021):
	for j in range(1,2021):
		if func(i,j)==1:
			totle_amount+=1
print(totle_amount)

 

 

第三题:蛇形填空

 

def fun(n):
    while n-1>=1:
        return fun(n-1)+4*(n-1)
    else:
        return 1
print(fun(20))

 

 

第四题:跑步锻炼

 

import datetime

star_date = datetime.date(2000, 1, 1)
end_date = datetime.date(2020, 10, 1)
days = datetime.timedelta(days=1)
count = 0

while(star_date <= end_date):
    if(star_date.day == 1 or star_date.isoweekday()==1):
        count += 2
    else:
        count += 1
    star_date += days

print(count)

 

 

第五题:七段码

 

import numpy as np
import itertools as it


class UnionFind:
    def __init__(self, n):
        self.father = list(range(n))
        self.size = [1] * n
        # 当前连通分量数目
        self.setCount = n

    def find(self, x):
        if self.father[x] == x:
            return x
        self.father[x] = self.find(self.father[x])
        return self.father[x]

    def merge(self, x, y):
        x, y = self.find(x), self.find(y)
        if x == y:
            return False
        if self.size[x] < self.size[y]:
            x, y = y, x
        self.father[y] = x
        self.size[x] += self.size[y]
        self.setCount -= 1
        return True


res = 0
data = list(np.zeros((7, 7)))

data[0][1] = data[0][5] = 1
data[1][0] = data[1][6] = data[1][2] = 1
data[2][1] = data[2][3] = data[2][6] = 1
data[3][2] = data[3][4] = 1
data[4][3] = data[4][5] = data[4][6] = 1
data[5][0] = data[5][4] = data[5][6] = 1

num = [i for i in range(0, 7)]

for i in range(1, 8):
    total = it.combinations(num, i)
    for j in total:
        uf = UnionFind(7)

        for z in j:
            for k in range(len(data[z])):
                z = int(z)
                b = int(data[z][k])
                if b == 1 and k in j:
                    uf.merge(z, k)

        if uf.setCount == 7 - len(j) + 1:
            res += 1

print(res)

 

 

第六题:成绩统计

 

n = int(input())
x, y = 0, 0
for _ in range(n):
    score = int(input())
    if score >= 60:
        x += 1
    if score >= 85:
        y += 1
print(f"{round(100 * x / n)}%")
print(f"{round(100 * y / n)}%")

 

 

第七题:回文日期

 

from calendar import isleap

gap_year = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
normal_year = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]


def judge(date, is_gap):
    month = int(date[:2])
    day = int(date[2:])
    if month > 12:
        return False
    if is_gap:
        return day < gap_year[month]
    else:
        return day < normal_year[month]


def judge_next_year(year: str):
    res_year = year[::-1]
    new_year = year + res_year
    revers_str = new_year[::-1]
    if new_year == revers_str:
        is_gap = isleap(int(year))
        flag = judge(res_year, is_gap)
        if flag:
            return [True, revers_str]
        else:
            return [False, revers_str]
    else:
        return [False, revers_str]


def get_next(data: str):
    year = data[:4]
    res = list()
    while True:
        year = str(int(year) + 1)
        ans = judge_next_year(year)
        flag, tmp = ans[0], ans[1]
        if flag:
            res.append(tmp)
            break
    num = int(data[0:2])
    while True:
        num += 1
        year = str(num) + str(num)
        ans = judge_next_year(year)
        flag, tmp = ans[0], ans[1]
        if flag:
            res.append(tmp)
            break
    return res


if __name__ == '__main__':
    data = input()
    res = get_next(data)
    for i in res:
        print(i)

 

 

第八题:子串分值和

 

def fun(s):
	x = 0
	for i in range(len(s)):
		for j in range(len(s) - i):
			a = s[j:j+i+1]
			a = set(a)
			x+=len(a)
	return x
print(fun('ababc'))

 

 

第九题:平面切分

 

N=int(input())
input_lis=[]
crosspoint_x_set=set()

for i in range(N):
    input_lis.append(list(map(int,input().split())))
input_lis=list(set([tuple(t) for t in input_lis]))
each_line_num_lis = [1] * (len(input_lis) + 1)
for i in range(1,len(input_lis)):
    crosspoint_x_set.clear()
    for n in range(i):
        if input_lis[i-n-1][0]!=input_lis[i][0]:
            x=round((input_lis[i][1]-input_lis[i-n-1][1])/(input_lis[i-n-1][0]-input_lis[i][0]),4)
            crosspoint_x_set.add(x)
    each_line_num_lis[i] += len(crosspoint_x_set)
print(sum(each_line_num_lis) )

 

 

第十题:字串排序

 

def px(words):
    count = 0
    for i in range(len(words)):
        for j in range(i+1,len(words)):
            if words[i] > words[j]:
                words[i], words[j] = words[j], words[i]
                count += 1
    return count
print(px(list('askfjhsafa')))

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值