洛谷入门题单

以下为1/22洛谷blog搬运

编程练习Day1——【入门1】顺序结构

第一天刷题,本次题目来源题单:【入门1】顺序结构。挑了几个觉得可以稍微记录下的题。

B2005 字符三角形

1
2
3
c = input()
for i in range(1,4):
print(' '*(3-i)+c*(2*i-1))

简单的循环输出。

P5704【深基2.例6】字母转换

1
2
3
c = input()
c = c.upper()
print(c)

利用upper()转换。

P5705【深基2.例7】数字反转

1
2
num = input().strip()
print(num[::-1])

本来是很简单的,但是之前一直WA…看了眼讨论区,发现是读入时没用strip()删除结尾的’/r’。

P5706【深基2.例8】再分肥宅水

1
2
t,n = map(float,input().split())
print("{:.3f}\n{:.0f}".format(t/n,2*n))

格式化输出。

P5708【深基2.习2】三角形面积

1
2
3
4
5
6
7
lst=list(map(float,input().split()))
p = sum(lst)/2
s = p
for i in range(3):
s *= p - lst[i]
s **= 1/2
print("{:.1f}".format(s))

列表输入,sum()函数。

P5707【深基2.例12】上学迟到

1
2
3
4
5
6
import math
s,v = map(int,input().split())
t = (8*60-10-math.ceil(s/v))
h = (t//60)%24
m = t%60
print("{:02}:{:02}".format(h,m))

做的有点久,但思路其实很简单。主要注意要用到math.ceil()向上取整,才能符合题意。小时数用总分钟数地板除60以后再和24取余,负数取余可得到正数。最后格式化输出02代表输出两位,不足补0。

1/23
完成了第二个题单,有一两道卡了下。
本次题目来源题单:【入门2】分支结构

P5709【深基2.习6】Apples Prologue / 苹果和虫子]

1
2
3
4
5
m,t,s=map(int,input().split())
if s<m*t:
print(int(m-s/t))
else:
print(0)

注意除零问题。

P5713【深基3.例5】洛谷团队系统

1
2
n = int(input())
print("Local" if 5 * n < 3 * n + 11 else "Luogu")

三目运算符。

P5714【深基3.例7】肥胖问题

1
2
3
4
5
6
7
8
9
m,h = map(float,input().split())
res = m/h**2
if res<18.5:
print("Underweight")
elif res>=18.5 and res<24:
print("Normal")
else:
print("{:6g}".format(res))
print("Overweight")

6g表示保留6位有效数字

P5715【深基3.例8】三位数排序

1
2
3
4
lst = list(map(int,input().split()))
lst.sort()
for i in lst:
print(i,end=' ')

用sort()排序。

P5716 【深基3.例9】月份天数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
yy,mm=map(int,input().split())
m1 = (1,3,5,7,8,10,12)
m2 = (4,6,9,11)
def is_leap(yy):
if yy%100==0:
if yy % 400 == 0:
return 1
return 0
else:
if yy % 4 == 0:
return 1
return 0
if mm in m1:
print(31)
elif mm in m2:
print(30)
else:
if is_leap(yy):
print(29)
else:
print(28)

没啥可说的。

P1085 [NOIP2004 普及组] 不高兴的津津

1
2
3
4
5
arr = []
for i in range(7):
a ,b = map(int,input().split())
arr.append(a+b)
print(arr.index(max(arr))+1 if max(arr)>8 else 0)

注意考虑小于8小时的情况。

P1909 [NOIP2016 普及组] 买铅笔

1
2
3
4
5
6
7
import math
n = int(input())
arr = []
for i in range(3):
a ,b = map(int, input().split())
arr.append(math.ceil(n/a)*b)
print(min(arr))

P5717【深基3.习8】三角形分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
side = list(map(int, input().split()))
side.sort()
if sum(side[:2])>side[-1]:
if side[0]**2+side[1]**2==side[-1]**2:
print("Right triangle")
elif side[0]**2+side[1]**2>side[-1]**2:
print("Acute triangle")
else:
print("Obtuse triangle")
if side[0]==side[1] or side[1]==side[-1]:
print("Isosceles triangle")
if side[0]==side[-1]:
print("Equilateral triangle")
else:
print("Not triangle")

做的时候想着三边都比一次多麻烦,想起自己判断三角形的时候都是先排序再计算,就优化了一下过程。

P1422 小玉家的电费

1
2
3
4
5
6
7
n = int(input())
if n <= 150:
print("{:.1f}".format(n * 0.4463))
elif n <= 400:
print("{:.1f}".format(150 * 0.4463 + (n - 150) * 0.4663))
else:
print("{:.1f}".format(150 * 0.4463 + 250 * 0.4663 + (n - 400) * 0.5663))

P1424 小鱼的航程(改进版)

1
2
3
4
5
6
7
8
9
x ,n = map(int, input().split())
day = n // 7 * 5
rem = n % 7
if rem:
if x + rem ==7 or x == 7: //如开始为周日肯定只休息一天;如r+x==7即最后一天为周六,也休息一天
rem -= 1
elif x + rem >= 8: //最后一天已过周日,休息两天
rem -= 2
print((day+rem)*250)

思路是弄明白游泳的天数,整一周肯定游5天。如果有剩余天数,和起始天数组合看看中间有没有休息。

P1888 三角函数

1
2
3
4
5
6
7
8
9
10
11
side = list(map(int, input().split()))
side.sort()
a = side[2]
b = side[0]
while a % b:
temp = a % b
a = b
b = temp
side[2] //= temp
side[0] //= temp
print("{}/{}".format(side[0],side[2]))

辗转相除法。

P4414 [COCI2006-2007#2] ABC

1
2
3
4
lst = list(map(int, input().split()))
lst.sort()
str = input()
print("{} {} {}".format(lst[ord(str[0])-ord('A')],lst[ord(str[1])-ord('A')],lst[ord(str[2])-ord('A')]))

注意转换。

P1055 [NOIP2008 普及组] ISBN 号码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 读入
isbn = list(input())
# '-'的下标位置列表
lst = [1,5,11]
# 校验和初始化
checksum = 0
# 倒着读lst,防止删除元素后导致下标变化
for i in lst[::-1]:
del isbn[i]
# 计算校验和
for i in range(len(isbn)-1):
checksum += int(isbn[i]) * (i + 1)
checksum %= 11
last = str(checksum)
# 求余为10则变为'X'
if last == '10':
last = 'X'
# 校验和检测
if last == isbn[-1]:
print("Right")
else:
# 重新加入'-'
for i in lst:
isbn.insert(i,'-')
isbn[-1]=last
print(''.join(isbn))

做的时候遗漏了checksum为10(X)的情况

1/28

P5719【深基4.例3】分类平均

1
2
3
4
5
6
7
8
9
n,k=map(int,input().split())
ok = []
nok = []
for i in range(1,n+1):
if i % k == 0:
ok.append(i)
else:
nok.append(i)
print("{:.1f} {:.1f}".format(sum(ok)/len(ok),sum(nok)/len(nok)))

P5720【深基4.例4】一尺之棰

1
2
3
4
5
6
length = int(input())
ans = 1
while length!=1:
length //= 2
ans += 1
print(ans)

P5721【深基4.例6】数字直角三角形

1
2
3
4
5
6
7
n = int(input())
res = 1
for i in range(n,0,-1):
for j in range(res,res+i):
print("{:02g}".format(j),end='')
res += i
print("\n",end='')

P1009 [NOIP1998 普及组] 阶乘之和

1
2
3
4
5
6
n = int(input())
lst = [1]
for i in range(1,n+1):
temp = lst[i-1] * i
lst.append(temp)
print(sum(lst)-1)

将1到n的阶乘存储到lst[1:n+1]中,每一项可以由前一项求得,避免了重复计算。最后再将阶乘加起来

P1980 [NOIP2013 普及组] 计数问题

1
2
n,x = map(int,input().split())
print(str(list(range(1,n+1))).count(str(x)))

利用str()list()range()转化成字符串,再用count()计数

P1307 [NOIP2011 普及组] 数字反转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
s = input()
def isnegative(s):
if int(s) < 0:
return 1
if isnegative(s):
# 去掉负号并倒序存入
s = s[:0:-1]
lst = list(s)
# 删除开头的0
if lst[0]=='0':
del lst[0]
# 直接int(str(lst))会报错,ValueError: invalid literal for int() with base 10
ans = - int(''.join(map(str, lst)))
else:
s = s[::-1]
ans = int(s)
print(ans)

P1720 月落乌啼算钱(斐波那契数列)

嗯?斐波那契

1
2
3
4
5
6
n = int(input())
f = [0,1]
for i in range(n):
num = f[i] + f[i+1]
f.append(num)
print("{:.2f}".format(f[n]))

P1420 最长连号

1
2
3
4
5
6
7
8
9
10
11
12
13
# 递归方法
n = int(input())
lst = list(map(int, input().split()))
res = []
for i in range(n):
temp = 1
for j in range(i+1,n):
if lst[j]==lst[j-1]+1:
temp += 1
else:
break
res.append(temp)
print(max(res))

P1075 [NOIP2012 普及组] 质因数分解

1
2
3
4
5
n = int(input())
for i in range(2,int(n**1/2)+1):
if n % i == 0:
print(int(n/i))
break

可能优化就是先挑出质数再遍历。

P5725【深基4.习8】求三角形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n = int(input())
temp = 1
for i in range(n):
for j in range(n):
print("{:02g}".format(temp),end='')
temp += 1
print()
print()
temp = 1
for i in range(n):
for j in range(n-i-1):
print(' '*2,end='')
for j in range(i+1):
print("{:02g}".format(temp),end='')
temp += 1
print()

P5726【深基4.习9】打分

1
2
3
n = int(input())
score = list(map(int,input().split()))
print("{:.2f}".format((sum(score)-max(score)-min(score))/(n-2)))

P4956 [COCI2017-2018#6] Davor

1
2
3
4
5
6
7
8
9
# 52*(7x+21k)=52*7(x+3k)
n = int(input())/(52*7)
x,k = 0,0
# x,k 为正整数; 1≤x≤100; x 尽可能大,k 尽可能小;
for k in range(1,int(n)):
x = n - 3*k
if x <= 100: break
k += 1
print("{:.0f}\n{:d}".format(x,k))

P1089 [NOIP2004 提高组] 津津的储蓄计划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
save,mum_save = 0,0
for i in range(12):
# 手中得到 300
save += 300
pay = int(input())
# 扣除每月预计花销
save -= pay
# 当月余额不足,程序结束
if (save<0):
print("-{}".format(i+1))
exit()
# 预计余额超过 100,存钱
if save >= 100:
mum_save += save // 100
save %= 100
save += mum_save * 120
print(save)

P1217 [USACO1.5] 回文质数 Prime Palindromes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a,b = map(int,input().split())
# 判断是否为素数
def is_prime(num):
for i in range(2,int(num**1/2)+1):
if num % i == 0:
return 0
return 1
# 判断是否为回文数
def is_palindrome(num):
s = str(num)
if s == s[::-1]:
return 1
return 0

for i in range(a,b+1):
if is_palindrome(i) and is_prime(i):
print(i)

tle了,需要改进算法。

1
2
3
4
5
6
7
def is_prime(num):
if num%2==0:
return 0
for i in range(3,int(num**1/2)+1,2):
if num % i == 0:
return 0
return 1

稍微变动了一下,判断完2以后,不再判断偶数。少了一个tle。

学习一下素数筛

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 埃式筛
# 核心思想:每找到一个质数,将其倍数全部删除
def get_prime(n):
# vis 表示是否删除
vis = [0] * (n + 1)
vis[0]=vis[1]=0
# 质数列表
prime = []
# 从小到大,找到第一个未被标记的数,就是质数
for i in range(2,n+1):
if vis[i]==0:
prime.append(i)
# 找到质数后删除其倍数
for j in range(i+i,n+1,i):
vis[j]=1
return prime

然鹅还是不行,先放这里吧。

P5723【深基4.例13】质数口袋

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
L = int(input())
# 埃式筛
def get_prime(n):
vis = [0] * (n + 1)
vis[0]=vis[1]=0
prime = []
for i in range(2,n+1):
if vis[i]==0:
prime.append(i)
for j in range(i+i,n+1,i):
vis[j]=1
return prime
prime = get_prime(L)
pack,pack_num = 0,0
for p in prime:
pack += p
pack_num += 1
if pack>L:
pack -= p
pack_num -= 1
break
print(p)
print(pack_num)

这题倒是简单。

1/29
不到一天的时间完成,不过收获颇多,像是用python创建多维数组,异或的应用,不同的输入方式什么的…

P1428 小鱼比可爱

1
2
3
4
5
6
7
8
9
10
11
n = int(input())
a = list(map(int,input().split()))
res = []
for i in range(n):
cnt = 0
for j in range(i):
if a[j]<a[i]:
cnt += 1
res.append(cnt)
for result in res:
print(result,end=' ')

P1427 小鱼的数字游戏

1
2
3
a = list(map(int,input().split()))
for i in a[-2::-1]:
print(i,end=' ')

P5727【深基5.例3】冰雹猜想

1
2
3
4
5
6
7
8
9
10
n = int(input())
res = [n]
while n!=1:
if n%2==0:
n//=2
else:
n = 3*n+1
res.append(n)
for i in res[::-1]:
print(i,end=' ')

P1047 [NOIP2005 普及组] 校门外的树

1
2
3
4
5
6
7
8
9
l, m = map(int,input().split())
# vis 记录树的存在,1 为存在,0 为不存在
vis = [1]*(l+1)
for _ in range(m):
u, v = map(int,input().split())
# 将区间内的树标为不存在
for i in range(u,v+1):
vis[i]=0
print(sum(vis))

P5728【深基5.例5】旗鼓相当的对手

1
2
3
4
5
6
7
8
9
10
11
12
13
n = int(input())
c,m,e,s=[],[],[],[]
res = 0
for i in range(n):
chi,math,eng = map(int,input().split())
c.append(chi)
m.append(math)
e.append(eng)
s.append(chi+math+eng)
for j in range(i):
if abs(c[i]-c[j])<=5 and abs(m[i]-m[j])<=5 and abs(e[i]-e[j])<=5 and abs(s[i]-s[j])<=10:
res += 1
print(res)

P2550 [AHOI2001] 彩票摇奖

1
2
3
4
5
6
7
8
9
10
11
12
13
n = int(input())
price = list(map(int,input().split()))
# 注意还有没获奖的情况
res = [0 for _ in range(8)]
for _ in range(n):
cnt = 0
lst = list(map(int,input().split()))
for i in lst:
if i in price:
cnt += 1
res[7-cnt] += 1
for i in res[:-1]:
print(i,end=' ')

P5729【深基5.例7】工艺品制作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
w, x, h = map(int,input().split())
q = int(input())
# 初始化三维数组
vis = [[[1 for _ in range(h)]for _ in range(x)]for _ in range(w)]
for i in range(q):
x1,y1,z1,x2,y2,z2=map(int,input().split())
# 区域内方块被标记清除
# 注意数组越界问题
for i in range(x1-1,x2):
for j in range(y1-1,y2):
for k in range(z1-1,z2):
vis[i][j][k]=0
# 统计剩余方块
cnt = 0
for i in range(w):
for j in range(x):
for k in range(h):
if vis[i][j][k]:
cnt += 1
print(cnt)

校门外的树升级版,一维数组变三维数组,注意数组边界。

P2615 [NOIP2015 提高组] 神奇的幻方

Magic Odd Square 代码同本题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
n = int(input())

# 幻方初始化
cube = [[0 for _ in range(n)] for _ in range(n)]
cube[0][((n+1)//2)-1] = 1
idx = [0,((n+1)//2)-1]

# 构建幻方
for i in range(2,n*n+1):
# i-1 在第一行
if idx[0] == 0:
# i-1 不在最后一列
if idx[1] != n-1:
# 更新索引
idx=[n-1,idx[1]+1]
else:
# 正下方
idx = [1,n-1]
elif idx[1] == n-1:
idx = [idx[0]-1,0]
else:
if cube[idx[0]-1][idx[1]+1] == 0:
idx = [idx[0]-1,idx[1]+1]
else:
idx = [idx[0]+1,idx[1]]
cube[idx[0]][idx[1]] = i

# 打印幻方
for i in range(n):
for j in range(n):
print(cube[i][j],end=" ")
print()

P5730【深基5.例10】显示屏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<cstdio>
using namespace std;
char c[10][5][4]= //打表数组,坑1
{//没有任何技术含量的打表
"XXX",//0
"X.X",
"X.X",
"X.X",
"XXX",
"..X",//1,右对齐,坑2
"..X",
"..X",
"..X",
"..X",
"XXX",//2
"..X",
"XXX",
"X..",
"XXX",
"XXX",//3
"..X",
"XXX",
"..X",
"XXX",
"X.X",//4
"X.X",
"XXX",
"..X",
"..X",
"XXX",//5
"X..",
"XXX",
"..X",
"XXX",
"XXX",//6
"X..",
"XXX",
"X.X",
"XXX",
"XXX",//7
"..X",
"..X",
"..X",
"..X",
"XXX",//8
"X.X",
"XXX",
"X.X",
"XXX",
"XXX",//9
"X.X",
"XXX",
"..X",
"XXX"
},ans[10][1000];//答案数组,坑4
int main(){//主函数
int n,a,s=0;//s表示当前位置
scanf("%d",&n);
while(n--){
scanf("%1d",&a);//坑3,小技巧%1d只读一位
for(int i=0;i<5;i++)//复制
for(int j=0;j<3;j++)
ans[i][s+j]=c[a][i][j];
for(int i=0;i<5;i++) ans[i][s+3]='.';//一列'.',坑5
s+=4;//往后挪
}
for(int i=0;i<5;i++){//输出
for(int j=0;j<s-1;j++) printf("%c",ans[i][j]);//注意范围,坑6
printf("\n");
}
return 0;//华丽结束
}

看着就痛苦,直接找大佬题解copy了。

P1554 梦中的统计

1
2
3
4
5
6
7
m, n = map(int,input().split())
res = [0]*10
for i in range(m, n+1):
for j in str(i):
res[int(j)] += 1
for ans in res:
print(ans, end=' ')

P2141 [NOIP2014 普及组] 珠心算测验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
n = int(input())
lst = list(map(int,input().split()))
lst.sort()
cnt = 0
for i in range(2,len(lst)):
flag = False
for j in range(i-1):
for k in range(j+1, i):
if lst[j] + lst[k] == lst[i]:
cnt += 1
flag = True
break
if flag:
break
print(cnt)

P1614 爱与愁的心痛

1
2
3
4
5
6
7
8
9
n, m = map(int, input().split())
# 注意ans初始化值不能太小,考虑到lst中每个值<=100,故初始化为101*m
lst, ans = [], 101*m
for i in range(n):
lst.append(int(input()))
# 注意range范围,莫名其妙被卡了半天
for i in range(n-m+1):
ans = min(ans, sum(lst[i:i+m]))
print(ans)

P2911 [USACO08OCT] Bovine Bones G

1
2
3
4
5
6
7
s1, s2, s3 = map(int, input().split())
cnt = [0] * (s1+s2+s3+1)
for i in range(1,s1+1):
for j in range(1,s2+1):
for k in range(1,s3+1):
cnt[i+j+k] += 1
print(cnt.index(max(cnt)))

P1161 开灯

1
2
3
4
5
6
7
8
9
10
11
12
# 模拟法
n = int(input())
# 再乘个1000就MLE了,不过这题只2e6就够了
lamp = [0] * 2000000
for _ in range(n):
a, t = map(float,input().split())
for i in range(1,int(t+1)):
if lamp[int(a*i)]:
lamp[int(a*i)] = 0
else:
lamp[int(a*i)] = 1
print(lamp.index(1))
1
2
3
4
5
6
7
8
9
# 利用异或,从开始一个灯没亮经过n次操作到只剩一个灯亮着,故每次与ans异或,到最后便为答案
# 比起上面的暴力,时间提升了40%,空间的利用也大幅降低,没有MLE的风险。
n = int(input())
ans = 0
for _ in range(n):
a, t = map(float,input().split())
for i in range(1,int(t+1)):
ans ^= int(a*i)
print(ans)

P5731【深基5.习6】蛇形方阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
n = int(input())
snake = [[0 for _ in range(n)] for _ in range(n)]
# d 代表方向:0右,1下,2左,3上
d = 0
# idx表示当前行与列的位置
idx = [0,0]
for i in range(1,n*n+1):
snake[idx[0]][idx[1]] = i
if d == 0:
# 到右侧边界
if idx[1] == n-1 or snake[idx[0]][idx[1]+1] != 0:
d = 1
idx[0] += 1
else:
idx[1] += 1
elif d == 1:
# 到下侧边界
if idx[0] == n-1 or snake[idx[0]+1][idx[1]] != 0:
d = 2
idx[1] -= 1
else:
idx[0] += 1
elif d == 2:
# 到左侧边界
if idx[1] == 0 or snake[idx[0]][idx[1]-1] != 0:
d = 3
idx[0] -= 1
else:
idx[1] -= 1
else:
# 到上侧边界
if snake[idx[0]-1][idx[1]] != 0:
d = 0
idx[1] += 1
else:
idx[0] -= 1
for i in range(n):
for j in range(n):
print("{:3g}".format(snake[i][j]),end='')
print()

又一道模拟题,开始没想到加个方向变量,后面想到了却又因为被绕进去了就调了半天…

P5732【深基5.习7】杨辉三角

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n = int(input())
# 初始化一个n*n的二维数组
lst = [[0 for _ in range(n)] for _ in range(n)]
# 生成杨辉三角
for i in range(n):
# 第一列为 1
lst[i][0] = 1
for i in range(1,n):
for j in range(1,i+1):
# 除第一列,每一个位置的数都是左上+正上
lst[i][j] = lst[i-1][j-1]+lst[i-1][j]
# 打印
for i in range(n):
for j in range(i+1):
print(lst[i][j], end=' ')
print()

P1789【Mc生存】插火把

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 边长,火把,萤石
n, m, k = map(int,input().split())
# 生成黑暗原野,为方便后面不再判定火把和萤石光的越界,这里数组开大些
field = [[0 for _ in range(n+4)] for _ in range(n+4)]
# 插火把
lst = [-2,2]
for _ in range(m):
x, y = map(int, input().split())
# 点亮
for i in range(x,x+3):
for j in range(y,y+3):
field[i][j] = 1
for i in lst:
field[x+1+i][y+1] = 1
field[x+1][y+1+i] = 1
# 摆萤石
for _ in range(k):
x, y = map(int, input().split())
# 点亮
for i in range(x-1,x+4):
for j in range(y-1,y+4):
field[i][j] = 1
# 生成怪物,并统计
cnt = 0
for i in range(2,n+2):
for j in range(2,n+2):
if field[i][j] == 0:
cnt += 1
print(cnt)

注意坐标表示,容易出错。

P1319 压缩技术

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
lst = list(map(int, input().split()))
# 标记当前输出字符
key = 0
# cnt 用来统计当前字符连续输出次数, idx 是 lst 中的索引,lst[idx] 对应当前字符需要重复的次数
cnt,idx = 0,1
for i in range(lst[0]):
for j in range(lst[0]):
# 注意应该先判断,我之前是先输出,结果样例过了,但是测试有8个WA,一看都是开头的是1,而不是0。
if cnt == lst[idx]:
# 异或实现key在0与1之间的转换
key ^= 1
cnt = 0
idx += 1
print(key,end='')
cnt += 1
print()

P1320 压缩技术(续集版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 由输入为N*N矩阵,可以从第一行输入获取N
# 习惯性的加了split()结果被卡了一会儿。
lst = list(map(int, input()))
n = len(lst)
for _ in range(n-1):
lst.extend(list(map(int, input())))
# ans是用于输出答案的数组,ans[0]为N,后面为压缩数字;cnt用于记录当前数字出现的次数
ans = [n]
cnt = 1
# 若第一个数字为1,则向ans添加0
if lst[0]:
ans.append(0)
for i in range(1,n*n):
if lst[i]==lst[i-1]:
cnt += 1
else:
ans.append(cnt)
cnt = 1
ans.append(cnt)
for i in ans:
print(i,end=' ')

P1205 [USACO1.2] 方块转换 Transformations

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# create_graph()
def create_graph():
return [['/' for _ in range(n)] for _ in range(n)]
# input_graph()
def input_graph(lst):
for i in range(n):
ipt = list(input())
for j in range(n):
lst[i][j] = ipt[j]
return lst
# 1.turn_90()
def turn_90(lst):
# (x,y)->(y,n-1-x)
res = create_graph()
for i in range(n):
for j in range(n):
res[j][n-1-i] = lst[i][j]
return res
# 2.turn_180()
def turn_180(lst):
for _ in range(2):
lst = turn_90(lst)
return lst
# 3.turn_270()
def turn_270(lst):
for _ in range(3):
lst = turn_90(lst)
return lst
# 4.reflect()
def reflect(lst):
res = create_graph()
for i in range(n):
for j in range(n):
res[i][n-1-j] = lst[i][j]
return res
# 5.combain()
def combain(lst):
lst = reflect(lst)
lst1 = turn_90(lst)
lst2 = turn_180(lst)
lst3 = turn_270(lst)
return lst1,lst2,lst3
# 6.is_same()
# determine if lst1 is same to lst2, true then return 1, else return 0.
def is_same(lst1,lst2):
for i in range(n):
for j in range(n):
if lst1[i][j] != lst2[i][j]:
return 0
return 1
# test()
def test(lst1,lst2):
if is_same(turn_90(lst1),lst2):
return 1
elif is_same(turn_180(lst1),lst2):
return 2
elif is_same(turn_270(lst1),lst2):
return 3
elif is_same(reflect(lst1),lst2):
return 4
elif is_same(lst1,lst2):
return 6
l1,l2,l3 = combain(lst1)
if is_same(l1,lst2) or is_same(l2,lst2) or is_same(l3,lst2):
return 5
return 7
# begin
n = int(input())
org, ter = create_graph(), create_graph()
org, ter = input_graph(org), input_graph(ter)
print(test(org,ter))

emmmm这是目前这周写的最长的代码了,不过写的很开心。

本题重点可能在找转90度后的坐标关系。

转180和270也有对应关系,不过直接偷懒摆了。

1/31
字符串掌握的明显不熟,需加强。

P5733【深基6.例1】自动修正

1
2
3
s = input()
s = s.upper()
print(s)

?

P1914 小书童——凯撒密码

1
2
3
4
n,s = int(input()),input()
for c in s:
# 注意z的下一个是a
print(chr((ord(c)+n-ord('a'))%26+ord('a')),end='')

P1125 [NOIP2008 提高组] 笨小猴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
s, cnt = input(), [0]*25
# 100以内质数,直接打表
prime = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
for c in s:
cnt[ord(c)-ord('a')] += 1
minx = 101
for i in cnt:
if i > 0 and i < minx:
minx = i
x = max(cnt)-minx
if x in prime:
print("Lucky Word",x,sep='\n')
else:
print("No Answer",0,sep='\n')

P1957 口算练习题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i = int(input())
for _ in range(i):
lst = list(map(str,input().split()))
if len(lst)==3:
if lst[0] == 'a':
op = '+'
elif lst[0] == 'b':
op = '-'
else:
op = '*'
res = lst[1]+op+lst[2]
else:
res = lst[0]+op+lst[1]
res = res+'='+str(eval(res))
print(res,len(res),sep='\n')

注意join()和+用法不一样,刚刚在这里卡了半天…

用到了eval()求表达式值

P5015 [NOIP2018 普及组] 标题统计

1
print(len(''.join(input().split())))

一行解决~

P5734【深基6.例6】文字处理软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
q, str = int(input()),input().strip()
for _ in range(q):
ipt = list(input().split())
if ipt[0] == '1':
str += ipt[1]
print(str)
elif ipt[0] == '2':
str = str[int(ipt[1]):int(ipt[1])+int(ipt[2])]
print(str)
elif ipt[0] == '3':
str = str[:int(ipt[1])]+ipt[2]+str[int(ipt[1]):]
print(str)
else:
print(str.find(ipt[1]))

本卡了半天,晕晕

以后注意在接受没用split()字符串的时候记得加个strip()

P1308 [NOIP2011 普及组] 统计单词数

1
2
3
4
5
6
7
8
9
10
11
12
# 因为空格也算数,又要保证数的是整个词,所以单词与文章前后加上空格,方便查找位置。
word = ' '+ input().strip().lower() + ' '
# article
arti = ' ' + input().lower() + ' '
if arti.find(word) < 0:
print(-1)
else:
idx, arti, cnt, word = arti.find(word), list(arti.split()), 0, word.split()[0]
for w in arti:
if word == w:
cnt += 1
print(cnt,idx)

P1765 手机

之前就被坑过,读字符串的时候加了strip(),但是还是WA了,翻了翻评论区,试了下replace(),就全过了

1
2
3
4
5
6
# 错误示范1:
s = input()
# 错误示范2:
s = input().strip()
# 正确输入方式:
s = input().replace('\r','')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# AC code:
keyboard = [['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l'],['m','n','o'],['p','q','r','s'],['t','u','v'],['w','x','y','z'],[' ']]
s, cnt = input().replace('\r',''), 0
for a in s:
idx = 0
for l in keyboard:
if a in l:
idx = ord(a)-ord(l[0])
break
cnt += idx+1
print(cnt)
# AC code2:
# 评论区偷的,提供另一个思路。
a=[1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4]
s=input().replace("\r","")
count=0
for i in range(0,len(s)):
if(s[i]==' '):
count+=1
else:
count+=a[int(ord(s[i]))-int(ord('a'))]
print(count)

P3741 honoka的键盘

开始的思路是:

存在3个V或3个k相连时,一次可以多一个VK

在开头和结尾只有两个V或者K的情况没有统计进去,故给前后都添加一个字符

但是这样做还是没全AC,剩下没过的全是多统计了一个

1
2
3
4
5
for add in ['V','K']:
copy = add + s + add
if "VVV" in copy or "KKK" in copy:
cnt += 1
break

s = “VVK” 情况下,下面这种判断不正确

1
2
if 'VV' in s or 'KK' in s:
cnt += 1

最终还是选择先遍历一遍字符串,统计“VK”数量并修改为XX,然后再查找是否还存在“VV”或“KK”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
n, s = int(input()), input().strip()
# 这次整个自动机吧
# state 0: pre is k; state 1: pre is v
state, cnt = 0, 0
# 先遍历一遍字符串,统计“VK”数量并修改为XX,然后再查找是否还存在“VV”或“KK”
for w in s:
if state:
if w == 'K':
cnt += 1
state = 0
continue
if w == 'V':
state = 1
s = s.replace("VK","XX")
if 'VV' in s or 'KK' in s:
cnt += 1
print(cnt)

P1321 单词覆盖还原

1
2
3
4
5
6
7
s = input().strip()
b_cnt, g_cnt = 0, 0
for i in range(len(s)-2):
b_cnt += int(s[i]=='b' or s[i+1]=='o' or s[i+2]=='y')
for i in range(len(s)-3):
g_cnt += int(s[i]=='g' or s[i+1]=='i' or s[i+2]=='r' or s[i+3]=='l')
print(b_cnt,g_cnt,sep='\n')

没想到代码这么简单…想了半天都想不出来,实在不行看了题解

P1553 数字反转(升级版)

1
2
3
4
5
6
7
8
9
10
11
12
s, ans = input().strip(), ''
if '.' in s:
s1, s2 = s.split('.')
ans = str(int(s1[::-1]))+'.'+str(int(s2))[::-1]
elif '/' in s:
s1, s2 = s.split('/')
ans = str(int(s1[::-1]))+'/'+str(int(s2[::-1]))
elif '%' in s:
ans = str(int(s[:-1][::-1]))+'%'
else:
ans = str(int(s[::-1]))
print(ans)

P1603 斯诺登的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
s, tar, value, res, ans = list(input().replace('\r','').split()), [], [], [], ''
# input().replace(" ",",")
key = ['one','two','three','four','five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen','twenty','a','both','another','first','second','third']
value.extend(list(range(1,21)))
value.extend([1,2,1,1,2,3])
dict = dict(list(zip(key,value)))
for i in s:
if i in dict.keys():
tar.append(dict[i])
for i in tar:
res.append(i*i%100)
res.sort()
for i in res:
ans = ans + "{:02g}".format(i)
# 判断ans是否有新数据加入
if ans != '':
print(int(ans))
else:
print(0)

P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here

1
2
3
4
5
6
7
8
s1, s2 = input().strip(), input().strip()
def f(s):
ans = 1
for c in s:
ans *= ord(c) - ord('A') + 1
ans %= 47
return ans
print("GO" if f(s1)==f(s2) else "STAY")

P1597 语句解析

1
2
3
4
5
a,b,c = 0,0,0
code = input().strip().replace(":=",'=').replace(";","\n")
# use exec() to run code.
exec(code)
print(a,b,c)

我真是个小机灵鬼

P1598 垂直柱状图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
rec, cnt = '', [0]*26
# print alphabet
# for i in range(26):
# print("'{}'".format(chr(i+ord('A'))),end=',')
alp = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
for _ in range(4):
rec += input().strip().replace(" ",'')
for c in rec:
if ord('A')<=ord(c)<=ord('Z'):
cnt[ord(c)-ord('A')] += 1
dict = dict(list(zip(alp,cnt)))
M = max(dict.values())
def f(dict,n):
cnt = 0
for i in dict:
if dict[i]>=n:
cnt += 1
for i in dict:
if dict[i]>=n:
print('*',end=' ')
cnt -= 1
if not cnt:
break
else:
print(' ',end=' ')
return print('')
for i in range(M,0,-1):
f(dict,i)
for a in alp:
print(a,end=' ')

2/3

P5735【深基7.例1】距离函数

1
2
3
4
5
6
7
points, c = [], 0.0
for _ in range(3):
points.append(list(map(float,input().split())))
def f(p1,p2):
return (abs(p1[0]-p2[0])**2 + abs(p1[1]-p2[1])**2)**0.5
c += f(points[0],points[1])+f(points[0],points[2])+f(points[1],points[2])
print("{:.2f}".format(c))

P5736【深基7.例2】质数筛

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
n, lst = input().strip(), list(map(int,input().split()))
# 埃式筛
def get_prime(n):
# vis 表示是否删除
vis = [0] * (n + 1)
vis[0]=vis[1]=0
# 质数列表
prime = []
# 从小到大,找到第一个未被标记的数,就是质数
for i in range(2,n+1):
if vis[i]==0:
prime.append(i)
# 找到质数后删除其倍数
for j in range(i+i,n+1,i):
vis[j]=1
return prime
prime = get_prime(max(lst))
for i in lst:
if i in prime:
print(i,end=' ')

P5737【深基7.例3】闰年展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
a, b = map(int, input().strip().split())
res = []
def is_leap(y):
if y%100==0:
if y%400==0:
return 1
return 0
if y%4==0:
return 1
return 0
for y in range(a,b+1):
if is_leap(y):
res.append(y)
print(len(res))
for y in res:
print(y,end=' ')

P5738【深基7.例4】歌唱比赛

1
2
3
4
5
6
7
n, m = map(int, input().strip().split())
res = []
for _ in range(n):
lst = list(map(int,input().strip().split()))
lst.sort()
res.append(sum(lst[1:-1]))
print("{:.2f}".format(max(res)/(m-2)))

P5739【深基7.例7】计算阶乘

1
2
3
4
5
6
n = int(input())
def f(n):
if n == 1:
return 1
return f(n-1)*n
print(f(n))

P5461 赦免战俘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
n = int(input())
res = [[1 for _ in range(2**n)] for _ in range(2**n)]
def f(x1,y1,x2,y2):
if x2-x1==1:
res[x1][y1] = 0
return
# 左上
for i in range(x1,(x1+x2+1)//2):
for j in range(y1,(y1+y2+1)//2):
res[i][j] = 0
# 右上
f((x1+x2+1)//2,y1,x2,(y1+y2-1)//2)
# 左下
f(x1,(y1+y2+1)//2,(x1+x2-1)//2,y2)
# 右下
f((x1+x2+1)//2,(y1+y2+1)//2,x2,y2)
return
f(0,0,2**n-1,2**n-1)
for i in range(2**n):
for j in range(2**n):
print(res[i][j],end=' ')
print()

被坐标卡了半天,难绷。最后还是带入例子验证了一遍。

P5740【深基7.例9】最厉害的学生

1
2
3
4
5
6
7
8
9
10
11
12
stu, n, idx, max_i, max_s = [], int(input()), 0, 0, 0
def sum_s(lst):
return int(lst[1])+int(lst[2])+int(lst[3])
for _ in range(n):
ipt = list(input().split())
stu.append(ipt)
if sum_s(ipt) > max_s:
max_s = sum_s(ipt)
max_i = idx
idx += 1
for i in stu[max_i]:
print(i,end=' ')
1
2
3
4
5
6
7
8
9
10
# class Student:
# def __init__(self):
# self.name = ''
# self.chi = 0
# self.math = 0
# self.eng = 0
# def sum_s(self):
# return self.chi+self.math+self.eng
# def print_s(self):
# print("{} {} {} {}".format(self.name,self.chi,self.math,self.eng))

试图用类,无果。

P5741【深基7.例10】旗鼓相当的对手 - 加强版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stu, n, idx= [], int(input()), 0
def sum_s(lst):
return int(lst[1])+int(lst[2])+int(lst[3])
def f(lst1,lst2):
for i in range(1,4):
if abs(int(lst1[i])-int(lst2[i])) > 5:
return 0
return 1
for _ in range(n):
ipt = list(input().split())
stu.append(ipt)
for i in range(n-1):
for j in range(i+1,n):
if abs(sum_s(stu[i])-sum_s(stu[j])) <= 10 and f(stu[i],stu[j]):
print(stu[i][0],stu[j][0],sep=' ')

P5742【深基7.例11】评等级

1
2
3
4
5
6
7
8
9
n = int(input())
def f(lst):
return (int(lst[1])+int(lst[2])) > 140 and (int(lst[1])*7+int(lst[2])*3) >= 800
for _ in range(n):
ipt = list(input().split())
if f(ipt):
print("Excellent")
else:
print("Not excellent")

P1304 哥德巴赫猜想

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
n = int(input())
def get_prime(n):
vis = [0]*(n+1)
vis[0]=vis[1]=1
prime = []
for i in range(2,n+1):
if vis[i] == 0:
prime.append(i)
for j in range(i+i,n+1,i):
vis[j] = 1
return prime
prime = get_prime(n)
for i in range(4,n+1,2):
for p in prime:
if i-p in prime:
print("{}={}+{}".format(i,p,i-p))
break

P2415 集合求和

1
2
lst = list(map(int,input().split()))
print(sum(lst)*2**(len(lst)-1))

P5743【深基7.习8】猴子吃桃

1
2
3
4
n, now = int(input()), 1
for _ in range(n-1):
now = (now + 1)*2
print(now)

P5744【深基7.习9】培训

1
2
3
4
n = int(input())
for _ in range(n):
lst = list(input().split())
print("{} {} {}".format(lst[0],int(lst[1])+1,int(int(lst[2])*1.2) if int(lst[2])<500 else 600))