2020蓝桥杯国赛

A 美丽的2

【问题描述】
小蓝特别喜欢 2,今年是公元 2020 年,他特别高兴。
他很好奇,在公元 1 年到公元 2020 年(包含)中,有多少个年份的数位中包含数字 2?

cnt = 0
for i in range(1,2021):
    if '2' in str(i):
        cnt += 1
print(cnt)

B 合数个数

【问题描述】
一个数如果除了 1 和自己还有其他约数,则称为一个合数。例如:1, 2, 3不是合数,4, 6 是合数。
请问从 1 到 2020 一共有多少个合数。

cnt = 0
for i in range(4,2021):
    for j in range(2,i//2+1):
        if i%j == 0:
            cnt += 1
            break
print(cnt)


C 阶乘约数

【问题描述】
定义阶乘 n! = 1 × 2 × 3 × · · · × n。
请问 100! (100 的阶乘)有多少个约数。

#方法一
cnt = [0]*110
def divide(x):
    i = 2
    while i*i<=x:
        if x%i == 0:
            while x%i == 0:
                x//=i
                cnt[i]+=1
        i+=1
    if x>1:
        cnt[x]+=1
for x in range(2,101):
    divide(x)
res = 1
for num in cnt:
    if num:
        res*=(num+1)
print(res)



#方法二
primes,cnt = [0]*110,0
minp = [0]*110
st = [False]*110
def get_primes(n): #线性筛法 O(n) 求得2100所有数的最小质因数minp
    global cnt
    for i in range(2,n+1):
        if st[i] == False:
            minp[i] = i
            primes[cnt] = i
            cnt += 1
        j = 0
        while primes[j]*i <=n:
            t  = primes[j]*i
            st[t]  = True
            minp[t] = primes[j]
            if i%primes[j]:
                j += 1
            else:
                break
get_primes(100)
num = [0]*110
for i in range(2,101): #统计每个质因数出现的次数num
    while i>1:
        p = minp[i]
        while i%p==0:
            i //=p
            num[p] += 1
print(num)
res = 1
for i in range(1,101):
    if num[i] != 0:
        res *= (num[i]+1)
print(res)

D 本质上升序列

【问题描述】
小蓝特别喜欢单调递增的事物。
在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串 lanqiao 中,如果取出字符 n 和 q,则 nq 组成一个单调递增子序列。类似的单调递增子序列还有 lnq、i、ano 等等。
小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第二个字符和最后一个字符可以取到 ao,取最后两个字符也可以取到 ao。小蓝认为他们并没有本质不同。
对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个?
例如,对于字符串 lanqiao,本质不同的递增子序列有 21 个。它们分别是 l、a、n、q、i、o、ln、an、lq、aq、nq、ai、lo、ao、no、io、lnq、anq、lno、ano、aio。
请问对于以下字符串(共 200 个小写英文字母,分四行显示):(如果你把以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 inc.txt,内容与下面的文本相同)

tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl

本质不同的递增子序列有多少个?

s=list(input())
n=len(s)
cnt=[1]*n
for i in range(n):
    for j in range(i):
        if s[i] > s[j]:
            cnt[i] += cnt[j]
        if s[i] == s[j]:
            cnt[i] -= cnt[j]
print(sum(cnt))

理解本质上升是什么意思

cnt[i] -= cnt[j]
换成 cnt[i] = 0
或者j从大到小枚举 碰到s[i] == s[j]break都行

E 玩具蛇

【问题描述】
小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。
小蓝还有一个 4 × 4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A 到 P 共 16 个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。
下图给出了两种方案:
在这里插入图片描述

请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。

def dfs(x,y,num):
    global cnt
    if num == 16:
        cnt += 1
        return
    st[x][y] = False
    for k in range(4):
        a,b = x+dx[k],y+dy[k]
        if 1<=a<=4 and 1<=b<=4 and st[a][b]:
            dfs(a,b,num+1)
    st[x][y] = True

cnt,st = 0,[[True]*5 for _ in range(5)]
dx,dy = [-1,0,1,0],[0,1,0,-1]
for i in range(1,5):
    for j in range(1,5):
        dfs(i,j,1)
print(cnt)

典型的dfs

F 天干地支

【问题描述】
古代中国使用天干地支来记录当前的年份。
天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊
(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。
地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、亥(hài)。
将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。2020 年是庚子年。
每过一年,天干和地支都会移动到下一个。例如 2021 年是辛丑年。
每过 60 年,天干会循环 6 轮,地支会循环 5 轮,所以天干地支纪年每 60年轮回一次。例如 1900 年,1960 年,2020 年都是庚子年。
给定一个公元纪年的年份,请输出这一年的天干地支年份。
【输入格式】
输入一行包含一个正整数,表示公元年份。
【输出格式】
输出一个拼音,表示天干地支的年份,天干和地支都用小写拼音表示(不表示声调),之间不要加入任何多余的字符。
【样例输入】
2020
【样例输出】
gengzi
【评测用例规模与约定】
对于所有评测用例,输入的公元年份为不超过 9999 的正整数。

tg = ['','xin','ren','gui','jia','yi','bing','ding','wu','ji','geng']
dz = ['','you','xu','hai','zi','chou','yin','mao','chen','si','wu','wei','shen']
n = int(input())
n = n-1
print(tg[1+n%10]+dz[1+n%12])

公元1年时xinyou年

H 答疑

【问题描述】
有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。
老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。
一位同学答疑的过程如下:

首先进入办公室,编号为 i 的同学需要 si 毫秒的时间。
然后同学问问题老师解答,编号为 i 的同学需要 ai 毫秒的时间。
答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可以忽略。
最后同学收拾东西离开办公室,需要 ei 毫秒的时间。一般需要 10 秒、
20 秒或 30 秒,即 ei 取值为 10000,20000 或 30000。
一位同学离开办公室后,紧接着下一位同学就可以进入办公室了。
答疑从 0 时刻开始。老师想合理的安排答疑的顺序,使得同学们在课程群
里面发消息的时刻之和最小
【输入格式】
输入第一行包含一个整数 n,表示同学的数量。
接下来 n 行,描述每位同学的时间。其中第 i 行包含三个整数 si, ai, ei,意
义如上所述。
【输出格式】
输出一个整数,表示同学们在课程群里面发消息的时刻之和最小是多少。
【样例输入】
3
10000 10000 10000
20000 50000 20000
30000 20000 30000
【样例输出】
280000
【样例说明】
按照 1, 3, 2 的顺序答疑,发消息的时间分别是 20000, 80000, 180000。
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ n ≤ 20。
对于 60% 的评测用例,1 ≤ n ≤ 200。
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ si ≤ 60000,1 ≤ ai ≤ 1000000, ei ∈ {10000, 20000, 30000},即 ei 一定是 10000、20000、30000 之一。

n = int(input())
f = []
for _ in range(n):
    a,b,c = map(int, input().split())
    f.append((a+b,c))
f.sort(key = lambda x : (x[0]+x[1]))
res,time = f[0][0],f[0][0]
for i in range(n-1):
    time += (f[i][1]+f[i+1][0])
    res += time
print(res)

贪心

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值