大学生程序设计创新实践基地2022年冬季校赛(NPU ACM Winter Contest)
总述
总体考察对于板子的熟练变换,以及考察离谱地使用python和对getchar()以及EOF的基础掌握程度。
B,D,E是防AK题目。
题解
A死锁
input
3 3
1 2 3
3 2 1
3 2 1
6 5 4
4 5 6
4 6 5
9 9 9
3 3
1 2 3
3 2 1
3 2 1
6 5 4
4 5 6
4 6 5
9 9 10
output
Dead Lock!
Yes!
思路
这是一个带模拟。
按照策略,如果一个程序使用目前的资源可以结束,那么就可以结束这一个进程,同时回收。如果对于所有的剩下的进程无法提供资源,那么就是死锁。
注意:是有多重输入,所以应该使用while(cin >> )形式
C 教科书般的亵渎
Problem Description
《炉石传说:魔兽英雄传》是一款由暴雪娱乐公司出品的策略类卡牌游戏,中国大陆地区的独家运营由网易公司代理。2014年3月13日全球同步正式运营,“酒馆战棋”模式于北京时间2019年11月6日凌晨2点国服开启抢先体验。
游戏背景设定于暴雪的魔兽系列,共十位魔兽中的角色作为十种不同的职业。而玩家要做的,就是根据己方现有的卡牌组建合适的卡组,指挥英雄,驱动随从,施展法术,与游戏好友或素不相识的对手一决高下。
在炉石传说游戏中,你需要控制随从来为你赢得战斗。有时,你需要及时处理对手的随从。你当然可以使用你的随从来攻击对手的;但是,当对手的场面过于庞大时,你可能需要法术来帮助解场。亵渎就是一张优质的解场法术,它上限极高,但需要一定的(有时极为复杂的)计算。本题的背景就是在你不控制任何随从的时候,
使用亵渎解场(消灭所有随从)。
为简化题意,我们假设:一张亵渎能对所有随从造成 1 点伤害,如果有随从死
亡,则再次施放亵渎;一个随从有生命值(一个整数),当生命值小于等于 0 时该随
从立即死亡;我们只使用亵渎解场,并且不考虑所有其他因素。
在2018年1月11日的逗鱼时刻中,异灵术老师在手牌中有扭曲虚空的情况下,仍
尝试使用亵渎解对面DK铺的一波场面:
经过不懈努力,最终异灵术仍没能在回合结束前算出解法。作为他的粉丝,小A决
定让你写个程序帮帮异灵术老师算数。
在此题中,每个随从依次入场,初始状态下场上无随从。每有一个随从入场,你都必须立刻算出:至少需要打出多少张亵渎,才能消灭场上已有的所有随从?
Input Format
输入共两行。
第一行,有且仅有一个正整数 N,表示战场上的随从数量。
第二行有 N 个正整数,第 i 个正整数 ai 表示第 i 个入场随从的初始生命值,相
邻两个正整数之间用一个空格隔开。
Output Format
一行,N个正整数,第 i 个数表示消灭第 1,2, ..., i 个随从需要打出的亵渎张数
的最小值。相邻两个正整数之间用一个空格隔开。
Hint
样例解释:
第 1 个随从入场,消灭第 1 个随从需要打出 1 张亵渎;
第 2 个随从入场,消灭第 1, 2 个随从需要打出
2 张亵渎;
第 3 个随从入场,消灭第 1, 2, 3 个随从需要打出 1 张亵渎。
输入
3
1 3 2
输出
1 2 1
思路
其实是一道水题
当有一大波随从进来以后,我们要消灭所有的随从,就相当于考虑消灭生命值最大的随从
(充分必要,最大的消灭了,那么所有的随从消灭了,并且仅仅最大的随从消灭了,那么所有的随从才能算是被消灭)
如果同一个生命值有许多的随从,其实相当于是只有一个随从(生命值同时降为0,仅仅引发一次亵渎)
现在想:如果仅仅有一个随从,那么就需要他的血量这么多的伤害。
如果小于最大的随从有m个(去重之后),那么仅仅需要\(n - m\)随从就可以了。
我们动态地进行考虑
当前消灭已经出现的随从要ans次亵渎
设当前的最大血量为maxv(初始值为-1)
- 添加的一个随从的血量已经出现,那么输出ans并且continue
- 添加的一个随从的血量不是最大,那么ans--
- 添加的一个随从的血量(用z表示)比maxv还要大,那么
ans += z - maxv - 1
这样就可以了
F 理论力学
提示:
Σn ≤ 200000 且所有输入均在C 语言long 范围内
输入1
1
1
2 2 1 1
输出1
No
输入2
1
2
2 2 1 1
-2 -2 -1 -1
输出2
Yes
思路
典型推式子然后C程序考试题。
需要使得
\[\sum F_x = 0\\ \sum F_y = 0\\ \sum xF_y - yF_x = 0\\ \]然后就可以了。
G 保险柜
小A有一个神奇的保险柜,需要输入正确的密码(一个正整数)后才能打开。神奇的是,这个保险柜的密码不唯一,也就是说存在多种合法的密码;一个密码合法, 当且仅当这个数能被 11 整除。
小A为了防止舍友小B窃密, 每次都会输入一个很大的密码。现在小A想问你:
他输入的这个数是不是一个合法密码?
Input Format
一行,一个正整数 S,表示密码。
Output Format
一行,一个字符串。如果密码合法,则输出“Yes”;否则输出“No”。大小写敏
感。
Hint
对于所有数据,有
0 ≤ lg S ≤ 2 × 10 5 。
输入1
11
输出1
Yes
输入2
12
输出2
No
思路
这一道题目对于python就是水题。
一句话:使用python写,自带高精度,堪比上课练习题
H 区间&&查询
ProblemDescription
给定 N 个区间 [l, r] (都是闭区间),对于每个区间,求出其余 N − 1个区间有多少个区间和该区间有交集([2, 5] 和[5, 7] 也视为有交集)。
Input Format
第一行输入一个正整数 N(2 ≤ N ≤ 10 5 ) 接下来的 N 行每行两个正整数 L i , Ri (1 ≤ Li ≤ Ri ≤ 10 9 )代表一个区间。
Output Format
输出 N 行,第 i 行代表其余N − 1 个区间有多少个区间和第i 个区间有交集。
输入1
3
1 5
2 4
5 6
输出1
2
1
1
思路
一开始想了许久,然后发现也很水。
所覆盖的区间数就是\(总数 - 1 - 当前区间左端点左边的其他区间右端点个数 - 当前区间右端点右边的其他区间左端点个数\)a(正着考虑难,那么就反着考虑,总数减去不覆盖的)
我们先把所有的区间的左端点,右端点存入两个数组l
,r
然后进行排序。
使用二分法来求出分界点坐标,然后求出当前区间左端点左边的其他区间右端点个数 以及 当前区间右端点右边的其他区间左端点个数
I 众里寻ta千百度
Hint
隧道最多只能走一次,当然也可以不走。
输入1
4 2
1 2 5
3 4 3
1
2 3 1
输出1
9
首先:使用SPFA,因为更新过程中变数比较多,迭代来的更稳一些
然后我们使用d[][0/1]
来存储每一个点到起点的距离。
如果是d[][0]
,那么表示存起点到这里,没有经过隧道。
如果是d[][1]
,那么表示存起点到这里,已经经过隧道。
对于当前点\(x\),
- 遇到公路,那么使用
d[x][0]
更新d[y][0]
,使用d[x][1]
更新d[y][1]
- 遇到隧道,那么使用
d[x][0]
更新d[y][1]
J 强制在线
输入1
3
1
3
2
输出1
3
1
2
3
这一道题目可以使用
- 复杂度直接爆炸的递归形式
- 线性的递推形式
- 使用矩阵快速幂可以过本题
这里使用矩阵快速幂。
K 买装备
Problem Description
A和B最近迷上了英雄联盟这款游戏,但A和B都是手残,每一次在游戏中都会拖队友的后腿。为了不影响其他队友的游戏体验,他们只能选择熔岩巨兽墨菲特和北地之怒瑟庄妮这些操作难度较低的英雄,即使手法上有所欠缺,但只要大到人就算有作用。但这样的英雄往往很难吃到经济,没有金币来购买装备。而队内的输出大哥,人头拿的多,野怪刷的快,往往很快就满装备了(一个英雄最多可以出 6 件装备),还剩出许多金币花不出去。于是A和B就在想,如果英雄可以买无限多的装备的话,输出大哥的战斗力会有多高呢?
在英雄联盟中有神话装备,传说装备,史诗装备和普通装备。每一个英雄只能买一件神话装备(在神话装备中选一件,也可以不买神话装备),而其他种类的装备可以同时购买,但是同样的一件装备只能买一个。
为了方便起见我们将一件装备 i 用 a *~i~* , b *~i~* , c*~i~*来表述。当 a*~i~* = 1 时,表示 i 为神话装备,a*~i~* = 0 时,表示 i 为其他种类的装备。 b*~i~*为购买装备 i 需要的金币,c*~i~*为装备 i 可以提供的战斗力。英雄的战斗力之和为他所拥有的装备的战斗力之和。
A现在拥有 M 个金币,问他最多可以拥有多少的战斗力。
Input Format
第一行输入两个整数 M, N。表示A拥有的金币数量 M 和商店老板提供的装备
数量 N;
接下来的 N 行,每行三个正整数 a i , b i , c i 。意义如题面所示。
Output Format
输出最多可以拥有的战斗力。
输入1
100 5
1 20 20
1 30 30
0 20 100
0 80 200
0 50 110
输出1
300
思路
这里就需要掌握到背包问题的精髓。
首先,我们把所有的非神化装备DP完,然后考虑神话装备。
- 不选神话装备,那么答案就是
dp[m]
- 如果要选择神话装备,首先看能不能买起,然后能力值就是
dp[m-价钱] + 价值
DP 的精髓赏析:
- 对于最后一件物品,DP一下就可以了,不需要对所有的m进行D
- 关于只能选择一种的类型,我放在最后,在把01背包的问题考虑完成以后再进行考虑。
L 寄你太美
Problem Description
小黑子A是个不折不扣的iKun,他发现很多字符串中都会出现cxk和ji的字样,他
想让你统计在一段文本中cxk和ji各出现了几次
由于小黑子A对cxk爱的深沉,他对你提出两个额外要求:
- 在两个字符间出现空格或换行符,不影响字符串匹配,但中间不能出现其他
字符,详见样例 1
- 大小写随意,详见样例 2
Input Format
若干行,包含空格、换行符和大小写字母,文件大小不超过
5 MB
Output Format
两个整数,分别代表cxk和ji出现的次数
输入1
c x
k w
o j
i g e
输出1
1 1
输入2
jINiTaImeICxk
输出2
1 1
思路
话说虽然是C语言课堂练习,但是这里优雅的写法是while((c = getchar()) != EOF)