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) 求得2到100所有数的最小质因数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)
贪心