1.2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入描述
输入包含一个八位整数 �N,表示日期。
对于所有评测用例,10000101≤�≤8999123110000101≤N≤89991231,保证 �N 是一个合法日期的 8 位数表示。
输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
输入输出样例
示例
输入
20200202
输出
20211202
21211212
题解:
import os
import sys
import datetime #导入日期库
# 请在此输入您的代码
idate=input()
y=int(idate[:4])#取出输入的年月日
m=int(idate[4:6])
d=int(idate[6:])
dd=datetime.date(y,m,d)#将输入的表示日期的字符串转换成日期
flag=True #回文日期只输出一次
for n in range(9999999):
dd=dd+datetime.timedelta(days=1)#日期不断增加1天
sd=str(dd).replace('-','')#将日期中的-去掉
if sd[:]==sd[::-1]:#判断日期是否是回文
if flag:
print(int(sd))#输出回文日期
flag=False#下次不输出回文日期
if sd[0]==sd[2]==sd[5]==sd[7] and sd[1]==sd[3]==sd[4]==sd[6]: #判断是否是ABABBABA类型
print(int(sd))#输出
break#结束循环
这道题一定得注意日期,不能忽略日期暴力破解(注:1年=12个月,1个月=30天)
2.你能让一叠卡片悬在桌子上多远?如果您有一张卡, 您可以创建半张卡长度的最大悬垂。(我们假设 卡片必须垂直于桌子。使用两张卡,您可以制作 顶部卡片悬垂底部一个半个卡长,底部一个悬垂 表格长度的三分之一,总最大悬垂为 1/2 + 1/3 = 5/6 卡长度。一般来说,你可以让n张牌悬垂1/2 + 1/3 + 1/4 + ... + 1/(n + 1) 张卡长,其中上一张牌悬垂第二张牌 到 1/2,第二个悬垂 tha 第三个悬垂 1/3,第三个悬垂第四个 1/4,依此类推,底牌悬垂在桌子上 1/(n + 1)。这是 如下图所示。
输入由一个或多个测试用例组成,后跟一行 包含表示输入结束的数字 0.00。每个测试用例 是包含正浮点数 c 的单行,其值为 至少0.01,最多5.20;c 将正好包含三位数字。
对于每个测试用例,输出实现所需的最小卡数 至少为 C 卡长度的悬垂。使用中所示的确切输出格式 的例子。
示例输入:
1.00
3.71 0.04
5.19
0.00
输出示例:
3 card(s)
61 card(s)
1 card(s)
273 card(s)
题解:
try:
while True:
a = float(input())
if 0.00<a<=5.20:
n = 2
s = 0
while True:
s+=float(1/n)
if s>=a:
ans = n-1
break
else:
n+=1
print(str(ans)+" card(s)")
except EOFError:
pass
3.小蓝要为一条街的住户制作门牌号。
这条街一共有 20202020 位住户,门牌号从 11 到 20202020 编号。
小蓝制作门牌的方法是先制作 00 到 99 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、71、0、1、7,即需要 11 个字符 00,22 个字符 11,11 个字符 77。
请问要制作所有的 11 到 20202020 号门牌,总共需要多少个字符 22?
题解:其实只要知道count()是统计字符串中字符出现的次数就行
import os
import sys
# 请在此输入您的代码
b=0
for i in range (1,2021):
a=str(i).count('2')
b+=a
print(b)
4.小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。
这不,大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。
小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。
现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。
取款机只能提供 100100 元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。
以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半价
**** 26.75 65折
**** 130.62 半价
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半价
**** 79.54 半价
**** 278.44 7折
**** 199.26 半价
**** 12.97 9折
**** 166.30 78折
**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半价
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半价
**** 218.37 半价
**** 289.69 8折
需要说明的是,88 折指的是按标价的 88% 计算,而 8 折是按 80% 计算,余者类推。 特别地,半价是按 50% 计算。
请输出小明要从取款机上提取的金额,单位是元。
题解:
s='''**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半价
**** 26.75 65折
**** 130.62 半价
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半价
**** 79.54 半价
**** 278.44 7折
**** 199.26 半价
**** 12.97 9折
**** 166.30 78折
**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半价
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半价
**** 218.37 半价
**** 289.69 8折'''
lst=[x.split(' ')for x in s.split('\n')]
c=0
for i in lst:
i[:]=[j for j in i if j != '']
i[:]=[j for j in i if j != '****']
d=i[1][:-1]
if d=='半':
d=0.5
elif len(d)==2:
d=int(d)/100
elif len(d)==1:
d=int(d)/10
c+=float(i[0])*d
print(int(c//100+1)*100)
暴力解法:(不推荐但是迫不得已可以使用)
import os
import sys
c1=180.90*0.88+10.25*0.65+56.14*0.9+104.65*0.9+100.30*0.88+297.15*0.5
c2=26.75*0.65+130.62*0.5+240.28*0.58+270.62*0.8+115.87*0.88+247.34*0.95
c3=73.21*0.9+101.00*0.5+79.54*0.5+278.44*0.7+199.26*0.5+12.97*0.9+166.30*0.78
c4=125.50*0.58+84.98*0.9+113.35*0.68+166.57*0.5+42.56*0.9
c5=81.90*0.95+131.78*0.8+255.89*0.78+109.17*0.9+146.69*0.68+139.33*0.65+141.16*0.78
c6=154.74*0.8+59.42*0.8+85.44*0.68+293.70*0.88+261.79*0.65
c7=11.30*0.88+268.27*0.58+128.29*0.88+251.03*0.8+208.39*0.75+128.88*0.75+62.06*0.9
c8=225.87*0.75+12.89*0.75+34.28*0.75+62.16*0.58+129.12*0.5
c9=218.37*0.5+289.69*0.8
c=c1+c2+c3+c4+c5+c6+c7+c8+c9
print("%.0f"%(((c//100)+1)*100)) #虽然是暴力解题,但仍要注意输出格式
5.
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
输入描述
输入的第一行包含一个整数 N(1≤N≤100),表示三角形的行数。
下面的 N 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。
输出描述
输出一个整数,表示答案。
输入输出样例
示例
输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
27
import os
import sys
# 请在此输入您的代码
h = int(input()) # 输入数据
W = [list(map(int, input().split())) for i in range(h)]
# 循环遍历计算到每一行的和的最大值
for i in range(1, h):
for j in range(0, i + 1):
if j == 0: # 最左边元素只能由右上方得到
W[i][j] += W[i - 1][j]
elif j == i: # 最右边元素只能由左上方得到
W[i][j] += W[i - 1][j - 1]
else: # 其余元素由上方较大值得到
W[i][j] += max(W[i - 1][j - 1: j + 1])
if h & 1: # 如果是奇数行,则返回最中间值
print(W[-1][h // 2])
else: # 偶数行则返回中间较大值
print(max(W[-1][h // 2 - 1], W[-1][h // 2]))