牛客寒假算法基础集训营4
A.Applese 的取石子游戏
题目描述:
Applese 和 Bpplese 在玩取石子游戏,规则如下:
一共有偶数堆石子排成一排,每堆石子的个数为 $ a_i $。两个人轮流取石子,Applese先手。每次取石子只能取最左一堆或最右一堆,且必须取完。最后取得的石子多者获胜。假设双方都足够聪明,最后谁能够获胜呢?
输入描述:
第一行是一个正偶数 n,表示石子的堆数。
第二行是 n 个正整数 $ a_1,a_2\cdots,a_n $,表示每堆石子的个数。
输出描述:
输出一个字符串“Applese”或“Bpplese”,表示胜者的名字。
输入
1 | 4 |
输出
1 | Applese |
备注:
$ 2 \leq n \leq 10^5 $
$ 1 \leq a_i \leq 10^5 $
$\sum a_i $ 为奇数
思路:
签道题!题解:TAG:脑洞,博弈
这是一道经典的博弈问题。可以使用动态规划来解决:dp[i][j]表示进行了 i 轮,从前面取走了 j 个时候的最大收益。这个老师上课的时候教过。
实际上,由于题面中的两个限制条件,可以得出先手有必胜策略:即选择所有的奇数项或者偶数项。如果奇数项的和较大,先手就取第一个,这样每一次轮到后手都只能取到偶数项。反之亦然同理。
因此,作为本场比赛的签到题之一,直接输出Applese即可通过。
AC代码:
1 |
|
B.Applese 走方格
题目描述:
精通程序设计的 Applese 又写了一个游戏。在这个游戏中,它位于一个 n 行 m 列的方阵中的左上角(坐标为 $ (0, 0) $,行的序号为 $ 0 \sim n−1 $,列的序号为 $ 0 \sim m−1)$。
现在它想不重复地走过所有格子(除了起点),最后回到左上角的一个方案。
每次只能往上下左右其中一个方向走一格。
输入描述:
仅一行两个整数 n 和 m,表示方阵的大小。保证大于 $ 1×1 $。
输出描述:
如果存在方案,则输出一行操作,包含”L”、”R”、”U”、”D”,分别表示左、右、上、下。如果有多种方案,输出任意一种即可。如果没有方案,则在一行中输出”-1”。
输入
1 | 2 2 |
输出
1 | RDLU |
备注:
$ 1 \leq n, m \leq 10 $.
思路:
做完签道题之后就开这题,一看数据很小,心里美滋滋,dfs深搜搞一搞,不过写丑了,输入 $ 8, 8 $ 之后就跑不出结果来QWQ,然后努力尝试着优化(未果),打标记发现递归在某一处进入死胡同,一直在那几个状态来回转移QWQ…..经过几个小时地挣扎之后,其实早已想到可以不用递归来解决,不过一直觉得可能是哪里没剪枝,相信只要设置一下条件……这是所有比赛以来第一次大胆尝试着用dfs写,回想当初学递归算法的时候,其实我的心里一直是抗拒的,日后的缺少训练导致现在比赛中不能轻易地AC掉某些很简单的题目,譬如本场比赛的 $ I $ 题QWQ,幸亏在队友的提示下,修改了一处(非递归)代码就AC了!感谢大佬!赛后看了一下用dfsAC的代码,果然是我写搓了,条件的构造真的太重要了!!!重新补了一下递归和模拟版(找一条固定路径)的解法。总结了一下,要多尝试,多思考,多做题!贴一下在比赛中自己缝缝补补的dfs:state:TLE!QWQ
TLE代码:
1 |
|
AC代码1:
1 |
|
AC代码2:
1 |
|
C.Applese 走迷宫
题目描述:
精通程序设计的 Applese 双写了一个游戏。
在这个游戏中,它被困在了一个 n×m 的迷宫中,它想要逃出这个迷宫。
在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时候才可以通过;有一些方格是岩浆,只有当 Applese 是火属性的时候可以通过;有一些方格是墙壁,无论如何都无法通过;另一些格子是空地(包括起点和终点),可以自由通过。在一些空地上有神秘道具可以让 Applese 转换自己的属性(从水属性变为火属性或从火属性变为水属性,需要一个单位的时间)
。
已知 Applese 在一个单位的时间内可以朝四个方向行走一格,且开始处于水属性,位于空地的道具拾取后只能在该处立即使用(或者不使用),且可以多次使用。求它走出迷宫需要的最少时间。
输入描述:
第一行两个正整数 n, m 表示迷宫的大小。
接下来 n 行,每行长度为 m 的字符串。描述地图。
其中 ‘S’ 表示起点,’T’ 表示终点,’.’ 表示空地,’w’表示岩浆,’~’表示水池,’@’ 表示道具,’#’表示障碍。
保证地图中的起点和终点只有一个,道具都位于空地。
输出描述:
输出一个整数,表示 Applese 走出迷宫的最短时间。特别地,如果 Applese 走不出迷宫,输出 “-1”。
输入
1 | 5 5 |
输出
1 | 18 |
备注:
$ 1 \leq n, m \leq 100 $.
思路:
典型的bfs求最短路。由于题目多加了一个状态:水、火,故求最短路也要多加一维,0:水,1:火。注意一个坑:某坐标点有道具,若有必要使用道具改变属性,则需在原地花费一个单位时间进行转化。
AC代码:
1 |
|
E.Applese 涂颜色
题目描述:
精通程序设计的 Applese 叕写了一个游戏。
在这个游戏中,有一个 n 行 m 列的方阵。现在它要为这个方阵涂上黑白两种颜色。规定左右相邻两格的颜色不能相同
。请你帮它统计一下有多少种涂色的方法。由于答案很大,你需要将答案对 $ 10^9 + 7 $ 取模。
输入描述:
仅一行两个正整数 n, m,表示方阵的大小。
输出描述:
输出一个正整数,表示方案数对 $10^9 + 7 $ 取模。
输入
1 | 1 1 |
输出
1 | 2 |
备注:
$ 1 \leq n,m \leq 10^{100000} $.
思路:
由于左右相邻两格的颜色不能相同,那么无论m是多少,每一行只有两种确定的填充状态,而每一行的状态又可以互相组合,所以答案就是 $ 2^n \% (10^9 + 7) $。由于n超大,并且2 与大质数 $ 1e9 + 7 $ 互质,所以要用扩展欧拉定理对指数降幂再用快速幂求解,公式: $ a ^ b \equiv a^{ b \% \varphi(p)} \;(mod \; p), \gcd(a, p) = 1 $。感想:赛后看了一下18级的通过率,本以为榜单中这题应该是全部绿色的,没想到才过了一半QWQ,看来有待加强训练。比赛前一整天就在机房里给ACM协会成员讲了数论四大定理(包括公式的由来及证明),次日比赛就用到了。从前几场比赛来看,都涉及了一些数论知识,日后要加强数学和思维方面的训练,ACM数学和思维真的很重要!!!
AC代码:
1 |
|
F. Applese 的QQ群
题目描述:
Applese 有一个QQ群。在这个群中,大家互相请教问题。如 b 向 a 请教过问题,就把 a 叫做是 b 的”老板”。这样一个群中就会有很多老板。
同时规定:如果 a 是 b 的老板,b 是 c 的老板,那么 a 也是 c 的老板。
为了不破坏群里面和谐交流的氛围,Applese 定了一个群规:不允许出现 a 既是 b 的老板, b 又是 a 的老板。
你需要帮助 Applese 判断大家是否遵守了群规。
输入描述:
第一行两个整数 n, m,表示群里的人数以及请教问题的数量。
接下来 m 行,每行两个整数 a, b,表示 a 是 b 的”老板”,即 b 向 a 请教了一个问题。
注:无论是否违反了群规,a 都会成为 b 的老板。
输出描述:
对于每次提问,输出一行”Yes”表示大家都遵守了群规,反之输出”No”。
输入
1 | 4 4 |
输出
1 | Yes |
备注:
$ 1 \leq n \leq 10^5 $
$ 1 \leq m \leq 2 \cdot 10^5 $
$ 1 \leq a, b \leq n $
思路:
一开始想用并查集,但样例中第四个输出是”No”,并且由于并查集是无向的,即已归并集合中元素之间的关系不能确定,所以用并查集的做法肯定是错的!显然这题要判断是否存在环,若存在环,即违反了群规,则之后每一次提问的输出都是”No”。正解:dfs或拓扑排序判环。由于不存在撤销操作,可以发现答案一定是一连串的Yes后再有一连串的No,所以只需二分最后一个Yes的位置即可。注意:dfs前应该建一条从b指向a老板(因为老板可能有很多个属下,若这样建图则多出了遍历儿子的时间,交一发超时,相反属下最多只有一个老板),然后dfs时,一路沿着儿子的父亲往上走,若找到已和当前相同的节点,则返回true,否则返回false。
AC代码1:
1 |
|
AC代码2:
1 |
|
G.Applese 的毒气炸弹
题目描述:
众所周知,Applese 是个很强的选手,它的化学一定很好。今天他又AK了一套题觉得很无聊,于是想做个毒气炸弹玩。毒气炸弹需要 k 种不同类型元素构成,Applese一共有 n 瓶含有这些元素的试剂。
已知元素混合遵循 m 条规律,每一条规律都可以用 “x y c” 描述。
表示将第 x 瓶试剂混入第 y 瓶试剂或者把第 y 瓶试剂混入第 x 瓶试剂,需要消耗 c 的脑力。特别地,除了这 m 条规律外,Applese 可以将任意两瓶相同元素的试剂混合,且不需要消耗脑力。
Applese 想要配出毒气炸弹,就需要使 S 中含有 $ 1 \sim k $ 这 k 种元素。它想知道自己最少花费多少脑力可以把毒气炸弹做出来。
输入描述:
第一行为三个整数 n, m, k 表示 Applese 拥有的试剂的数量,混合规律的数量和所需的元素种类数。
第二行为 n 个整数 $ a_1,a_2,\cdots,a_n $,分别表示每一瓶试剂的元素类型。
接下来m行,每行三个整数 x, y, c,含义如题目描述中所述。不保证 x, y的试剂种类不同。
输出描述:
输出一个正整数表示最小的耗费脑力。特别地,如果无法合成出毒气炸弹,输出 “-1”。
输入
1 | 6 8 2 |
输出
1 | 2 |
备注:
$ 1 \leq n,k,m \leq 10^5 $
$ 1 \leq x, y \leq n, x \neq y $
$ 1 \leq c \leq 10^9 $
思路:
把相同元素类型的试剂看作一个节点,然后用克鲁斯卡尔求刚好由k个点(k种元素配置毒气炸弹)组成的最小生成树,若不能找到,则输出-1。这题真的好简单QWQ。
AC代码:
1 |
|
I.Applese 的回文串
题目描述:
自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串。
这样的题目未免让它觉得太无聊,于是它想到了一个新的问题。如何判断一个字符串在任意位置(包括最前面和最后面)插入一个字符后能不能构成一个回文串?
输入描述:
仅一行,为一个由字母和数字组成的字符串 s。
输出描述:
如果在插入一个字符之后可以构成回文串,则输出”Yes”, 否则输出”No”。
输入
1 | applese |
输出
1 | No |
备注:
$ |s| \leq 10^5 $.
思路:
dfs简单过QWQ!题目要求插入一个字符后能否构成一个回文串,换个角度也就是删除任意一个字符能否构成一个回文串。因为删除的字符只有一个,且当删除字符的个数大于1,很快被return掉,所以用dfs可以简单快速求解!以后要多学学dfs的技能姿势QWQ!
题解:可以认为插入和删除是等价的操作。想到这一点,这题就会好做很多。如果这个串本身就是回文串,答案一定是Yes。否则我们只需要考虑串中对称的位置不相等的两个字符,分别尝试把它们删掉后判断一下是不是回文的就行了。
总结:的确,我们只需判断三次就能确定答案,因为第一个不同的地方有两种情况,尝试着删除第一个不同位置的两个字符中任意一个,若删后能构成一个回文串,显然是满足条件的,否则肯定不能构成一个回文串。好一个思维题!
AC代码1:
1 |
|
AC代码2:
1 |
|
J.Applese 的减肥计划
题目描述:
Applese 最近又长胖了,于是它打算减肥——练习举重。
他在举重的时候用两只手往不同方向用力,从而把杠铃举起来。
已知 Applese 两只手分别产生的力的大小,以及它们之间的夹角,试求两力合力的大小。
输入描述:
仅一行三个整数 $ f_1,f_2,a$,分别表示两只手产生的力的大小以及它们之间的夹角。
输出描述:
输出一个实数表示两力合力的大小,要求相对误差或绝对误差不超过 $ 10^{-6} $。
严格来讲,如果你的答案是 a,而标准答案是 b,那么当 $ \frac{|a-b|}{max{1,|b|}} \leq 10^{-6} $ 时,你的答案会被认为是正确的。
输入
1 | 6 8 90 |
输出
1 | 10.0000000000 |
备注:
$ 1 \leq f_1,f_2 \leq 100 $
$ 0 \leq a \leq 180 $
思路:
签道题!根据余弦定理:$ cosA = \frac{b^2 + c^2 - a^2}{2bc} $ 可得 $ F = \sqrt{f_1^2 + f_2^2 + 2f_1 f_2 cos \alpha }$.
注意 $ \alpha $ 是弧度制,即 $1^{\circ} = \frac{\pi }{180} rad $。
AC代码:
1 |
|
- 本文链接: http://blog.wzomg.cn/posts/debac4bf.html
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!