MST2.0开发(7)--任务奖励/通行证

任务奖励/通行证

这部分用到了 颜色匹配(ColorMatch) ,文档暂时写的还不全,故这里简单讲一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"一键领取": {
"recognition": "ColorMatch",
"roi": [
180,
566,
161,
46
],
"lower": [
230,
190,
9
],
"upper": [
280,
240,
59
],
"action": "Click"
}

method 默认 4,选择 RGB

找到颜色所在界面,截图,然后放到 ps 等工具里取色,获取RBG值。

设置合理的范围,这里lower和upper分别设置为RBG值-25和+25。

MST2.0开发(5)--教会补给

教会补给

没啥新东西,自己到 canteen.json 看吧。

注意 roi 填的 string (任务名):填写任务名,在之前执行过的某任务识别到的目标范围内识别。这里是任务匹配上的范围,不是其 roi 范围。

然后是一个 replace 的样例,文档里没写,我来补充一下。

现欲识别目标串“空白区域”,由于ocr模型等原因,会将 识别为 ,期望的 pipeline 写法为:

1
2
3
4
5
6
"recognition": "OCR",
"expected": "空白区域",
"replace": [
"(目|自)",
"白"
]

可用正则匹配。正则相关可以查询 [菜鸟教程](Python3 正则表达式 | 菜鸟教程 (runoob.com)) 。

MST2.0开发(4)--商店

商店

大致思路前面已经展示过两、三遍了,故重复的不再赘述,只讲讲新东西。

首先判定进到补给礼包的界面并加载完毕,用的是一号位的 “每日剩余:x/1”“剩余”

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
"进入补给礼包界面": {
"recognition": "OCR",
"expected": "补给礼包",
"roi": [
0,
130,
220,
581
],
"action": "Click",
"next": [
"补给礼包加载完毕",
"进入补给礼包界面"
],
"on_error": [
"返回主界面"
]
},
"补给礼包加载完毕": {
"recognition": "OCR",
"expected": "剩余",
"roi": [
311,
579,
112,
30
],
"only_rec": true,
"next": [
"1号体力溢出检测",
"1号补给无",
"1号补给有"
]
}

领取的步骤为:检测体力溢出——检测补给存在——检测免费字段——下一位/返回主页面

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
"1号补给无": {
"recognition": "OCR",
"expected": "本日剩余:0",
"roi": [
315,
580,
88,
25
],
"only_rec": true,
"next": [
"2号体力溢出检测",
"2号补给无",
"2号补给有"
]
},
"1号补给有": {
"recognition": "OCR",
"expected": "本日剩余:0",
"roi": [
315,
580,
88,
25
],
"only_rec": true,
"inverse": true,
"next": [
"识别1号免费",
"识别1号不免费"
]
},
"识别1号免费": {
"recognition": "OCR",
"expected": "免费",
"roi": [
344,
623,
48,
24
],
"only_rec": true,
"action": "Click",
"next": [
"override_购买"
]
},
"识别1号不免费": {
"recognition": "OCR",
"expected": "免费",
"roi": [
344,
623,
48,
24
],
"only_rec": true,
"inverse": true,
"next": [
"位于主界面1",
"位于主界面2",
"位于主界面3"
],
"interrupt": [
"点击返回按钮"
],
"on_error": [
"返回主界面"
]
},
"1号体力溢出检测": {
"recognition": "OCR",
"expected": "精神力低于",
"roi": [
283,
505,
156,
21
],
"only_rec": true,
"next": [
"位于主界面1",
"位于主界面2",
"位于主界面3"
],
"interrupt": [
"返回主界面_fast"
]
}

2号除了出口和1号不一样,其他都按1号做一遍。

MST2.0开发(3)--邮件

邮件

实现逻辑

  1. 确保当前在主页面,否则执行返回主页面。
  2. 进入邮件页面,并点击一键领取。
  3. 判断已领取所有邮件便返回主页面结束任务
  4. 超时处理,直接返回主页面。

具体实现

1

和前面签到的实现一样,我们先在程序入口判断页面并返回主页面,然后再开始一系列操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// interface.json
{
"name": "领取邮件",
"entry": "领取邮件",
"pipeline_override": {
"override_位于主界面": {
"next": [
"领取邮件开始"
]
},
"override_点击空白区域": {
"next": [
"返回主界面"
]
}
}
}
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
// mail.json
{
"name": "领取邮件",
"entry": "领取邮件",
"pipeline_override": {
"override_位于主界面": {
"next": [
"领取邮件开始"
]
},
"override_点击空白区域": {
"next": [
"返回主界面"
]
},
"返回主界面_fast": {
"interrupt": [
"点击空白区域",
"退出邮件",
"关闭悬浮窗",
"点击返回按钮",
"加载中",
"加载中1",
"其他特殊退出"
]
}
}
}

这样就可以在返回主页面以后 领取邮件开始 开始领取了。

2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"领取邮件开始": {
"recognition": "TemplateMatch",
"template": "./PreReceive/mail.png",
"roi": [
1082,
34,
146,
124
],
"action": "Click",
"next": [
"override_点击空白区域",
"邮件领取完毕"
],
"interrupt": [
"邮件领取按键"
],
"timeout": 15000,
"on_error": [
"返回主界面"
]
}

3

这里分两种情况:

  1. 有可领取的邮件
  2. 邮件已全部领取

在点击 "邮件领取按键" 后:

第一种情况下,会跳出领取窗口,此时会运行 "override_点击空白区域" 并退回到主页面。

第二种情况下,会显示 无可领取附件 ,脚本识别到后执行 退出邮件 并返回主页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"邮件领取完毕": {
"recognition": "OCR",
"expected": "附件",
"roi": [
569,
236,
141,
22
],
"only_rec": true,
"next": [
"位于主界面1",
"位于主界面2",
"位于主界面3"
],
"interrupt": [
"退出邮件"
],
"on_error": [
"返回主界面"
]
}

MST2.0开发(2)——签到

本篇采用模块化说明重构过程。

签到

由于签到逻辑由 1.x 的和游戏启动绑定变为独立执行,所以整体都需要重写。

整体分析

  1. 首先判断是否在主页面,不在则尝试返回主页面,不行则重启。

  2. 确认在主页面,点击右上角区域进入签到页面,然后签到。

  3. 签到完成,返回主页面。

具体实现

1

参照 startup.json 完成,后续可能做成 custom recognition。

这里用到了新的功能 pipeline_override ,做一个简单说明。

1
2
3
4
5
6
7
8
9
10
11
"位于主界面": {
"recognition": "OCR",
"expected": "相伴",
"roi": [
8,
72,
1257,
534
],
"action": "DoNothing"
}

global.json 中,完成了 “位于主界面” (判断当前处于主界面)功能,但是只有判断的功能,现在想让该功能的next 列表变为想要执行的签到任务,方法如下。

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
// interface.json
{
"name": "每日签到",
"entry": "每日签到",
"pipeline_override": {
"override_位于主界面": {
"next": [
"签到事件开始"
]
},
"override_点击空白区域": {
"next": [
"七日签到"
]
},
"返回主界面_fast": {
"interrupt": [
"点击空白区域",
"关闭悬浮窗",
"退出功能列表",
"点击返回按钮",
"退出作战",
"退出主线",
"加载中",
"加载中1",
"其他特殊退出"
]
}
}
}

2

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
"签到事件开始": {
"next": [
"进入签到页面"
],
"interrupt": [
"点击签到入口"
]
},
"进入签到页面": {
"next": [
"处于签到页面",
"进入签到页面"
]
},
"处于签到页面": {
"next": [
"已签到"
],
"interrupt": [
"点击空白区域",
"未签到"
]
},
"未签到": {
"next": [
"点击签到"
]
},
"已签到": {
"next": [
"位于主界面"
],
"interrupt": [
"点击空白区域",
"七日签到",
"返回主界面_fast"
]
},
"七日签到": {
"next": [
"点击七日签到"
]
}

整体采取状态+动作的方式设计,确保不会出问题。

MST2.0开发(1)--游戏启动、关闭

背景

MST 1.x 中,本人完成了基于maafw 1.7.x 的 pipeline 实现。

本次需要完成游戏启动、关闭的重构。

流程

启动游戏

分渠道启动

用到了首先用到了StartApp,这里会根据package name确定启动的 APP。

经过在网上的大量搜寻、下载并安装,获取到对应包名:

1
2
3
4
5
6
7
8
9
"package": "com.glkj.lhcx.gf", # 官网、TapTap
"package": "com.glkj.lhcx.bilibili", # bilibili
"package": "com.glkj.lhcx.mi", # 小米
"package": "com.glkj.lhcx.huawei", # 华为
"package": "com.IQIgame.lhcx.vivo", # vivo
"package": "com.glkj.lhcx.oppo.nearme.gamecenter", # oppo
"package": "com.glkj.lhcx.m4399", # 4399
"package": "com.glkj.lhcx.aligames", # 9游、豌豆荚
"package": "com.tencent.tmgp.glkj.lhcx01", # 应用宝、联想

修改 interface.json中的resource,按文件夹放置不同渠道需要覆盖 base (官网、TapTap )的 json 代码,以实现不同渠道的游戏启动

启动游戏中的操作

简单说一下写的逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"启动游戏": {
"next": [
"位于主界面"
],
"interrupt": [
"热更新判断",
"启动界面等待",
"启动界面点击任意区域",
"启动界面关闭公告",
"加载中",
"灵魂潮汐",
"关闭悬浮窗",
"sub_启动游戏"
]
}

与之前 1.x 的代码不同,这次代码重构跟随 maafw 的更新,舍弃使用 is_sub 字段,改用 interrupt 代替,可以明显感受到逻辑的简洁以及代码量可阅读性的提升。(也有可能是本人的水平比较小杯)

interrupt 中的任务是在前面 next 数组都没匹配上时,匹配上便执行其与本身 next 数组后,再重新执行前面 next 数组,可能说的有点绕口, interrupt 具体相关说明还得到 maafw 文档中 3.1-任务流水线协议 查看。

特别的,这里 interrupt 先根据识别优先级排序,"热更新判断" 在测试时发现必须先于"启动页面等待" 进行判断,否则若有更新,便会陷入死循环;"sub_启动游戏" 由于无判断条件,必然匹配,优先级最低,放在最后;其他无明显优先级的任务为了节省资源,选择按匹配频率排序。

这里,"启动游戏" 的唯一出口便是 "位于主界面"

再贴一下 “启动界面点击任意区域" 的逻辑。

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
"启动界面点击任意区域": {
"recognition": "OCR",
"expected": "点击任意区域继续",
"roi": [
540,
555,
201,
43
],
"action": "Click",
"target": true,
"next": [
"位于主界面"
],
"interrupt": [
"加载中",
"关闭悬浮窗",
"灵魂潮汐"
]
}
// 2024/10/4 更新
// 上面是有bug的写法,由于本游戏反应比较慢,存在进入主界面过几秒再弹窗的情况,故需修改。
{
"next": [
"位于主界面",
"启动界面点击任意区域"
],
"interrupt": [
"关闭悬浮窗",
"加载中",
"灵魂潮汐"
]
}
// 将任务本身放入next,既避免了重复回到"启动游戏"中判断,又能一次判定成功便回到"启动游戏"中。

这里 "位于主界面" "加载中" "关闭悬浮窗" 由于其他模块会复用,放到 global.json 方便日后管理。

总结

这次推翻重写,由于框架本身升级,以及个人对框架、项目及pipeline的更进一步理解,程序的健壮性有所提升,开发逻辑也更加清晰,期待接下来的蜕变。

更新

2024/10/2

修改内容

2.0 第一次提交的代码用到了 post_delay ,会增加延迟,并且当前任务 "灵魂潮汐" 下的三种界面无法识别到,处理方式为匹配 "interrupt" 中最后一个无条件执行任务 "sub_启动游戏" 。当前的处理准确识别每一个界面保证返回到主页面。

2024/10/4

修改内容

优化逻辑,避免了窗口关闭不完全的情况。

修改”启动界面等待”逻辑,从OCR改为匹配右下角少量图标模板。

增加热更新任务OCR识别范围。

待完成

EASY

停服处理

HARD

如正在游戏中,但不处于 "启动游戏" 除无条件匹配任务 sub_启动游戏 外所有任务的可匹配范围,则会陷入死循环,如何处理。

如在执行脚本过程中,遇见模拟器卡死等相关问题,如何处理?

MST2.0开发

背景

几个月前尝试使用MaaFramework(下称maafw)的pipeline完成MST的基本实现,现趁maafw更新到2.0之际,决定实现部分功能自行集成,并配上简单的 gui 界面。

任务分析

原pipeline的修改

在之前的工作中,由于本人对maafw的了解不够充分,有部分内容(如:interface.json)编写稍有瑕疵,现在需要在更新过程中完成修改。

集成的实现

另一个重要任务便是实现集成。本人当前对翻阅使用文档和各个相关项目后依旧是一头雾水,maafw 1.8之前的集成实现有所了解,但2.0后废除 ExecAgent 功能及相关接口,需重新实现集成。

GUI的实现

当前预计采用pyqt设计界面,期望实现:

  • adb 连接
  • 功能添加、删除、拖动
  • log显示

其他

以上三点是较重要较急的任务,其他暂时想到的还有识别的优化(训练模型)、资源更新。

洛谷入门题单

以下为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))