LINE Verda Programming Contest (AtCoder Beginner Contest 263) A~E 题解

A - Full House

题目大意

来自一个掼蛋爱好者的翻译qwq

给定一副扑克牌中五张牌的编号\(A,B,C,D,E\),判断这五张是否为一组“三带二”。(不懂的自行百度

数据范围:\(1\le A,B,C,D,E\le 13\),且\(A,B,C,D,E\)不会全部相同。

输入格式

\(A~B~C~D~E\)

输出格式

如果是“三带二”,输出Yes;否则,输出No

样例

\(A\) \(B\) \(C\) \(D\) \(E\) 输出
\(1\) \(2\) \(1\) \(2\) \(1\) Yes
\(12\) \(12\) \(11\) \(1\) \(2\) No

分析

嘿嘿,被自己的翻译给笑喷了吓住了,从来没见过这么垃圾的翻译!
话不多说,这A题就是水(虽然studentWheat这位大佬还WA了3次,具体怎么WA的请大家好好学学引以为戒),解法很多,但是个人感觉还是直接统计一下来得简单明了,见代码。

代码

#include <cstdio>
using namespace std;int cnt[13];int main()
{for(int i=0; i<5; i++){int x;scanf("%d", &x);cnt[--x] ++;}bool has2 = false, has3 = false;for(int i=0; i<13; i++)if(cnt[i] == 2) has2 = true;else if(cnt[i] == 3) has3 = true;puts(has2 && has3? "Yes": "No");return 0;
}

B - Ancestor

题目大意

\(N\)个人,第\(i\)个人的父/母是\(P_i\),题目保证\(P_i<i\)
问:第\(N\)个人是第\(1\)个人的第几代?

\(2\le N\le 50\)
\(1\le P_i<i\)

输入格式

\(N\)
\(P_2~P_3~\dots~P_N\)

输出格式

输出答案。

分析

本题可以使用\(\text{DFS}\),但没有必要。题目限制条件特别给出了\(P_i<i\),因此如果按输入顺序依次处理每个人的世代,一个人的父亲肯定在这个人之前被考察到。

下面来看详细过程。
我们设\(\text{depth}_i=~\)\(i\)个节点的深度,因此答案为\(\text{depth}_N\)
初始时,\(\text{depth}_0=0\)。对于\(i=1\dots N\),依次设置\(\text{depth}_i:=\text{depth}_{P_i}+1\)
最终,输出结果即可。总时间复杂度为\(\mathcal O(N)\)

代码

#include <cstdio>
#define maxn 55
using namespace std;int dep[maxn];int main()
{int n;scanf("%d", &n);for(int i=1; i<n; i++){int f;scanf("%d", &f);dep[i] = dep[--f] + 1;}printf("%d\n", dep[n - 1]);return 0;
}

C - Monotonically Increasing

题目大意

输出所有的长度为\(N\)严格上升的序列,其中每个元素都在\([1,M]\)之间,按字典升序输出,\(1\le N\le M\le 10\)

输入格式

\(N~M\)

输出格式

字典升序输出所有符合条件的序列,一行一个,序列中的每个元素用空格分隔。

分析

基础的回溯算法题,见代码。

代码

#include <cstdio>
#define maxn 15
using namespace std;int n, m, ans[maxn];void dfs(int pos, int last)
{if(pos == n){for(int i=0; i<n; i++)printf("%d ", ans[i]);putchar('\n');return;}while(++last <= m){ans[pos] = last;dfs(pos + 1, last);}
}int main()
{scanf("%d%d", &n, &m);dfs(0, 0);return 0;
}

D - Left Right Operation

题目大意

给定长为\(N\)的整数序列\(A=(A_1,A_2,\dots,A_N)\)
你可以进行下列两个操作,每个最多一次:

  • 选择整数\(x\),将\(A\)的前\(x\)项全部改成\(L\)
  • 选择整数\(y\),将\(A\)的后\(y\)项全部改成\(R\)

求操作后,最小的\(A\)中所有元素之和。

\(1\le N\le 2\times 10^5\)
\(-10^9\le L,R,A_i\le 10^9\)

输入格式

\(N~L~R\)
\(A_1~A_2~\dots~A_N\)

输出格式

输出答案。

分析

\(f_i=(\)使用操作\(1\)选择\(x\le i\)时的前\(i\)个序列元素的最小和\()\)
\(~~~~g_i=(\)使用操作\(2\)选择\(y\le i\)时的后\(i\)个序列元素的最小和\()\)
则可得递推式\(f_i=\min\{f_{i-1}+A_i,L\times i\}\)\(g_i\)同理。
此时,枚举两种操作的分界点\(i\),则答案为\(\min\limits_{i=1}^N(f_i+g_{N-i})\)。实现时,可将\(g\)数组倒过来计算,这样答案为\(\min\limits_{i=1}^N(f_i+g_{i+1})\)

递推式的正确性证明
前面已经提到了,\(f_i=\min\{f_{i-1}+A_i,L\times i\}\)为什么?
先看\(\min\)后面的部分,应该好理解,就是前\(i\)个全部替换成\(L\)的总和。前面的\(f_{i-1}+A_i\)才是关键。考虑\(f_{i-1}\)的计算来源,要么是从\(f_{i-2}+A_{i-1}\)递推过来的,要么也是直接用\(L\times(i-1)\)得到的。再考虑\(f_{i-2},f_{i-3},\dots,f_1\)会发现,递推式的结果一定是(一段\(L\))+(一段\(A_i\))得到的。因此,这个递推式正确。\(g\)的正确性也可以用同样的方法证明,感兴趣的读者可以自行尝试。

总时间复杂度为\(\mathcal O(N)\)

代码

注意使用long long

#include <cstdio>
#define maxn 200005
using namespace std;using LL = long long;
inline LL min(const LL& x, const LL& y)
{return x < y? x: y;
}int a[maxn];
LL f[maxn], g[maxn];int main()
{int n, l, r;scanf("%d%d%d", &n, &l, &r);for(int i=0; i<n; i++)scanf("%d", a + i);f[0] = min(l, a[0]);for(int i=1; i<n; i++)f[i] = min(f[i - 1] + a[i], (i + 1LL) * l);for(int i=n-1; i>=0; i--)g[i] = min(g[i + 1] + a[i], LL(n - i) * r);LL ans = g[0];for(int i=0; i<n; i++)ans = min(ans, f[i] + g[i + 1]);printf("%lld\n", ans);return 0;
}

E - Sugoroku 3

题目大意

\(N\)个方格,分别是方格\(1\),方格\(2\),..,方格\(N\)
在方格\(1,2,\dots,N-1\)上,各有一枚骰子。方格\(i\)上的骰子会按照相同的概率随机输出\(0,1,\dots,A_i\)中的一个。

直到到达方格\(N\)之前,你每次会前进骰子输出的步数。换句话说,如果你在方格\(x\)上(\(1\le x<N\)),骰子输出了数字\(y\)\(0\le y\le A_i\)),你下一步会到达方格\(x+y\)

求到达方格\(N\)步数的期望值,对\(998244353\)取模。

\(2\le N\le 2\times 10^5\)
\(1\le A_i\le N-i\)\(1\le i<N\)

有理数取模【洛谷模板:P2613】
任意一个有理数都可被表示为\(\frac PQ\)的形式。令\(R\)为取模的结果,则\(R\times Q\equiv P~(\bmod~998244353)\)
友情提示:对于除法计算,如\(\frac AB\)计算时,改为\(A\times B^{P-2}\bmod P\),其他逐步取模即可。本题中,\(P=998244353\)

输入格式

\(N\)
\(A_1~A_2~\dots~A_{N-1}\)

输出格式

输出答案,对\(998244353\)取模。

分析

\(\text{dp}_i=~\)\(i\)\(N\)的期望步数,则初始状态为\(\text{dp}_N=0\),答案为\(\text{dp}_1\)
由于在方格上不能倒退,因此考虑倒序计算\(\text{dp}\)。对于第\(i\)个点,易得

\[\text{dp}_i=\frac{\sum\limits_{j=i}^{i+A_i}\text{dp}_j}{A_i+1}+1 \]

其中,求和即遍历后面每一个下一步可能到达的位置,乘上出现概率\(\frac1{A_i+1}\),最后再加上\(1\)表示使用一步。
由于左右都有\(\text{dp}_i\),无法直接计算,我们将其单独提出并解方程,得:

\[\text{dp}_i=\frac{(\sum\limits_{j=i}^{i+A_i}\text{dp}_j)+A_i+1}{A_i} \]

此时,时间复杂度为\(\mathcal O(N^2\log P)\)(快速幂inv操作需要\(\log P\)的时间,其中\(P=998244353\)),使用后缀和优化后可达\(\mathcal O(N\log P)\),可以通过本题。

代码

#include <cstdio>
#define maxn 200005
#define MOD 998244353
using namespace std;using LL = long long;
int a[maxn], suf[maxn];inline int inv(LL x)
{LL res = 1LL;int p = MOD - 2;while(p){if(p & 1) (res *= x) %= MOD;(x *= x) %= MOD, p >>= 1;}return res;
}int main()
{int n, cur;scanf("%d", &n);for(int i=0; i<n-1; i++)scanf("%d", a + i);for(int i=n-2; i>=0; i--){int t = suf[i + 1] - suf[i + 1 + a[i]];if(t < 0) t += MOD;cur = (a[i] + t + 1LL) % MOD * inv(a[i]) % MOD;if((suf[i] = suf[i + 1] + cur) >= MOD)suf[i] -= MOD;}printf("%d\n", cur);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794254.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法笔记】树形DP算法总结详解

0. 定义 树形DP,又称树状DP,即在树上进行的DP,是DP(动态规划)算法中较为复杂的一种。 1. 基础 令\(f[u]=~\)与树上顶点\(u\)有关的某些数据,并按照拓扑序(从叶子节点向上到根节点的顺序)进行\(\text{DP}\),确保在更新一个顶点时其子节点的dp值已经被更新好,以更新当前…

Seay安装和初步使用

作者网站现在已经无法访问:http://www.cnseay.com/2951/, 可以使用这个GitHub - f1tz/cnseay: Seay源代码审计系统 下载完安装包之后,解压到自己想要的电脑路径即可,无需进行任何额外的配置 利用工具对sql注入进行分析 进入软件之后,点击新建项目,选择需要分析的文件(这里…

纸浆

日线: 小时线: 15分钟趋势: 关注5750一线支撑

代码整洁之道--读书笔记(5)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

02网络参考模型

02网络参考模型02网络参考模型常见网络模型因为 OSI协议栈比较复杂 ,且TCP和IP两大协议在业界被广泛使用,所以 TCP/IP参考模型 成为了互联网的主流参考模型。OIS网络模型层级作用7.应用层 应用层 对应用程序提供接口。6.表示层进行数据格式的转换,以确保一个系统生成的应用层…

《痞子衡嵌入式半月刊》 第 107 期

痞子衡嵌入式半月刊: 第 107 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

鼠标悬停显示的轮播图

今日整理,发现这种轮播图是最难实现的一种, 1.再循环中难以控制单一品类商品显示 解决办法: 在外面的主类里面添加&:hover触发标签属性的更改,这样可以单一作用 2.在循环中触发事件,所有的同一事件都会触发 解决办法:先建立模版控制排版,再从单一内容开始微调 <script s…

如何把网页的公式优雅地拷贝到word中:数学公式识别神器—Mathpix Snip

这个编辑器其实在把chatgpt的公式粘贴到word中时就已经使用了,用的是网页版。 现在下载了软件(但是好像一个月试用期过后得收费?但是就目前来说,体验感真的超级好) 把公式复制粘贴转成mathtype公式 可以截取电脑屏幕上的图像,如果图像上面有公式的话,就会识别,之后可以…

Redis 入门 - 图形化管理工具如何选择,最全分类

Redis图形化管理工具可分为四类:命令行工具、桌面客户端工具、网页工具、插件工具。看看哪一款适合你呢?工欲善其事必先利其器,上一章Redis服务环境已经搭建完成,现在就需要一个趁手的工具,有个好工具可以做到事半功倍。 Redis图形化管理工具五花八门,可供选择的很多,大…

Javaweb-事务

注意在当前窗口是修改了的:而在其他窗口是不修改的:select @@autocommit;修改为手动提交:

格路计数

前言 完全借鉴于 洛谷日报 前提条件 在一个网格图上, 每一次可以从 \((x,y)\) 走到 \((x+1,y-1)\) 或者 \((x+1,y-1)\) 限制是一条直线 \(y=k\) 题外话 我们其实可以发现这和每一次可以从 \((x,y)\) 走到 \((x+1,y)\) 或者 \((x, y+1)\) 限制是一条 \(45\)的斜线 \(y=x+k\) 是等…

9.2-9.8 总结

zhicheng123456做题 因为联考众多,所以说只有不多的做题。主要得知了两个结论:找树剖到根的轻链(动态)的方法和把线段(均匀随机分界点)分为 \(n\) 段的 \(k\) 短值的计算。 联考:https://www.cnblogs.com/british-union/p/liankao.html 还是时常在简单的东西上失败,但是…