- 星期一 - 611
import datetime
start = datetime.date(1901, 1, 1)
end = datetime.date(2000, 12, 31)
delta = datetime.timedelta(days=1)
s = 0
while start <= end:
if start.weekday() == 0:
s += 1
start += delta
print(s)
或
# 看有几个星期
from datetime import *
dt1 = datetime(1901, 1, 1)
dt2 = datetime(2000, 12, 31)
delta = dt2 - dt1
print(delta.days//7)
python标准库-datetime
- 合法日期-541
import datetime
m = int(input()) # month
d = int(input()) # date
try:
datetime.date(2021, m, d)
print('yes')
except:
print('no')
- 分数-610
top = 0
for i in range(20):
top += 2**i
print(str(top)+'/'+str(2**19))
- 图像模糊-550
n, m = map(int, input().split()) # n行m列
pic = []
for i in range(n):
a = list(map(int, input().split()))
assert len(a) == m
pic.append(a)
assert len(pic) == n
out = [[0]*m for _ in range(n)]
def avg(x, y): # 坐标
s, num = 0, 9
l = [[0, 0], [-1, 0], [1, 0], [0, 1], [0, -1], [-1, -1], [-1, 1], [1, -1], [1, 1]]
for i in range(9):
if x + l[i][0] < 0 or x + l[i][0] >= n or y + l[i][1] < 0 or y + l[i][1] >= m:
num -= 1
continue
s += pic[x+l[i][0]][y+l[i][1]]
return int(s / num)
for i in range(n):
for j in range(m):
out[i][j] = str(avg(i, j))
for i in range(n):
print(' '.join(out[i]))
- 扫雷-549
和上一题很像。
n, m = map(int, input().split())
mp = []
for i in range(n):
a = list(map(int, input().split()))
assert len(a) == m
mp.append(a)
assert len(mp) == n
def ct(x, y): # 坐标
if mp[x][y] == 1:
return 9
else:
s = 0
l = [[1, 0], [-1, 0], [0, 1], [0, -1], [-1, -1], [-1, 1], [1, -1], [1, 1]]
for i in range(8):
if x+l[i][0] < 0 or x+l[i][0] >= n or y+l[i][1] < 0 or y+l[i][1] >= m:
continue
if mp[x+l[i][0]][y+l[i][1]] == 1:
s += 1
return s
out = [[0]*m for _ in range(n)]
for i in range(n):
for j in range(m):
out[i][j] = str(ct(i, j))
for i in range(n):
print(' '.join(out[i]))
- 时间加法-548
a = int(input()) # a点
b = int(input()) # b分
t = int(input()) # t分钟后
a += (b+t)//60
b = (b+t)%60
print(a)
print(b)
- 最大间隙-543
n = int(input()) # length
l = list(map(int, input().split()))
assert len(l) == n
val = 0
for i in range(n-1):
a = l[i+1]-l[i]
val = max(val, a)
print(val)
- 成绩分析-497
n = int(input())
l = []
for i in range(n):
a = int(input())
l.append(a)
print(max(l))
print(min(l))
print("{:.2f}".format(sum(l)/n))
不可以用round():
>>> round(5/2, 2)
2.5
-
回文日期-498
-
绘制表格-290
N, M = map(int, input().split()) # N行M列
# start
print('┌'+'─┬'*(M-1)+'─┐')
vt = '│ '*M + '│'
md = '├' + '─┼'*(M-1) +'─┤'
for i in range(N-1):
print(vt)
print(md)
print(vt)
# end
print('└'+'─┴'*(M-1)+'─┘')
- 天干地支-1029
y = int(input())
tg = ['geng', 'xin', 'ren', 'gui', 'jia', 'yi', 'bing', 'ding', 'wu', 'ji']
dz = ['shen', 'you', 'xu', 'hai', 'zi', 'chou', 'yin', 'mao', 'chen', 'si', 'wu', 'wei']
print(tg[y%10], end='')
print(dz[y%12], end='')
- 字串分值和-1037
贡献度:出现在多少个不同的子串中。
参考
s = input()
n = len(s)
s = ' ' + s # 占位
lst = [0]*(ord('z')+1)
ans = 0
for i in range(1, n+1):
ans += (i-lst[ord(s[i])])*(n-i+1)
lst[ord(s[i])] = i
print(ans)
- 子串分值-499
都会超时,方法一40分,方法二80分
方法一:暴力法
s = input()
n = len(s)
ans = 0
for i in range(n):
for j in range(1, n+1):
sb = s[i:j]
for k in sb:
if sb.count(k) == 1:
ans += 1
print(ans)
方法二:参考
s = input()
n = len(s)
pos = [list() for _ in range(ord('z')+1)]
for i in range(n):
pos[ord(s[i])].append(i)
ans = 0
for i in range(n):
nw = pos[ord(s[i])].index(i)
# 如果s[i]的前面/后面没有相同的字母,pre=-1/ltt=n
# 公式: (i-pre)*(ltt-i)
if nw == 0:
pre = -1
else:
pre = pos[ord(s[i])][nw-1]
if nw == len(pos[ord(s[i])])-1:
ltt = n
else:
ltt = pos[ord(s[i])][nw+1]
ans += (i-pre)*(ltt-i)
print(ans)
- 谁拿了最多奖学金-565
n = int(input()) # 学生总数
dt = []
for i in range(n):
dt.append(input().split())
assert len(dt) == n
for i in range(n):
dt[i][1], dt[i][2], dt[i][5] = int(dt[i][1]), int(dt[i][2]), int(dt[i][5])
otpt = [[dt[i][0]] for i in range(n)]
wh = 0
for i in range(n):
s = 0
if dt[i][1] > 80 and dt[i][5] >= 1:
s += 8000
if dt[i][1] > 85 and dt[i][2] > 80:
s += 4000
if dt[i][1] > 90:
s += 2000
if dt[i][1] > 85 and dt[i][4] == 'Y':
s += 1000
if dt[i][3] == 'Y' and dt[i][2] > 80:
s += 850
otpt[i].append(s)
wh += s
otpt.sort(key=lambda x:x[1], reverse=True)
print(otpt[0][0])
print(otpt[0][1])
print(wh)
- Fibonacci 数列与黄金分割-200
从n=20开始结果就不变了,所以用if else结构写出来,要不然会超时。
n = int(input())
a = 1
b = 1
if n <= 19:
for i in range(n-1):
a, b = b, a+b
print("{:.8f}".format(a/b))
else:
print(0.61803399)
- Playfair密码-286
不算难,但是真的太烦了。
ms = input()
ws = input()
al = list('abcdefghijklmnopqrstuvwxyz')
# 方阵
for i in ms:
al.remove(i)
psq = list(ms) + al
psq = psq[:-1]
# 把待加密字符串分组
if len(ws) % 2 == 0:
lws = [0]*(len(ws)//2)
for i in range(len(lws)):
lws[i] = list(ws)[2*i:2*i+2]
else:
lws = [0]*(len(ws)//2+1)
for i in range(len(lws)-1):
lws[i] = list(ws)[2*i:2*i+2]
lws[-1] = ws[-1]
for i in range(len(lws)):
try:
id1 = psq.index(lws[i][0])
id2 = psq.index(lws[i][1])
except:
pass
if len(lws[i]) == 1 or lws[i] == lws[i][::-1] or lws[i][0] not in psq or lws[i][1] not in psq:
lws[i] = lws[i]
elif id1//5 == id2//5 or id1%5==id2%5:
lws[i][0], lws[i][1] = lws[i][1], lws[i][0]
else:
if lws[i][1] > lws[i][0]:
lws[i][1] = psq[id1+(id2//5-id1//5)*5]
lws[i][0] = psq[id2-(id2//5-id1//5)*5]
else:
lws[i][0] = psq[id2+(id1//5-id2//5)*5]
lws[i][1] = psq[id1-(id1//5-id2//5)*5]
for i in lws:
print(''.join(i), end='')