AtCoder Beginner Contest 370 补题记录

news/2025/1/15 13:19:32/文章来源:https://www.cnblogs.com/klri/p/18406932

A - Raise Both Hands

题意:

给出Snuke举的左右手情况,如果只举左手,输出Yes,如果只举右手,输出No,否则输出Invalid

思路:

  • 举左手:(l == 1 && r == 0)
  • 举右手:(l == 1 && r == 0)
  • 其他情况都是Invalid
void solve()
{int l = read(), r = read();if(l == 1 && r == 0){cout<<"Yes"<<endl;}else if(l == 0 && r == 1){cout<<"No"<<endl;}else { cout<<"Invalid"<<endl;}
}

B - Binary Alchemy

题意:

\(N\) 种编号为 \(1, 2, \ldots, N\) 的元素。

元素之间可以相互组合。当元素 \(i\)\(j\) 组合在一起时,如果 \(i \geq j\) 变为元素 \(A_{i, j}\) ,如果 \(i < j\) 变为元素 \(A_{j, i}\)

从元素 \(1\) 开始,依次与元素 \(1, 2, \ldots, N\) 结合。求最后得到的元素。

思路:

根据题意,模拟查表,逐一合成即可

void solve()
{int n = read();int a[N][N];for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) a[i][j] = read();int x = 1;for(int t=1;t<=n;t++){int i = max(x,t) , j = min(x,t);x = a[i][j];}cout<<x<<endl;
}

C - Word Ladder

题意:

给定两个长度相等的字符串 \(S\)\(T\),
用最小的操作次数,使得 \(S = T\) ,并且字符串 \(X\) 的字典序最小。
操作为,选择 \(S_i = c\) ,并且将修改后的 \(S\) 放入 \(X\) 的末尾。

思路:

  • 显然S和T有多少个不同的字符就操作多少次就是次数最少
  • 考虑使X的字典序最小,在S中修改字符,越靠前并且越小的字符应该越靠后修改
  • 故两次遍历S,先从前往后遍历,若\(S_i < T_i\)则操作一次
  • 再从后往前遍历,将剩下不一样的字符修改掉
void solve()
{string s1 = sread(), s2 = sread();int n = s1.length();vector<string> ans;for(int i=0;i<n;i++){if(s1[i] > s2[i]){s1[i] = s2[i];ans.push_back(s1);}}for(int i=n-1;i>=0;i--){if(s1[i]!=s2[i]){s1[i] = s2[i];ans.push_back(s1);}}cout<<ans.size()<<endl;for(auto it:ans) cout<<it<<endl;
}

D - Cross Explosion

题意:

\(H \times W\) 的二维网格,初始所有格子都有墙
\(Q\) 次操作,每次操作都在\((x , y)\)处放一炸弹

  • \((x , y)\)没有墙,则炸毁墙
  • \((x , y)\)有墙,则分别炸毁上下左右的最近的第一面墙

思路:

对于每一个坐标\((x , y)\),可以分成行和列来考虑

  • 在第x行中,可以用二分查找找到第一个坐标大于等于y的墙
  • 在第y列中,可以用二分查找找到第一个坐标大于等于x的墙
    因此,我们需要一个 既能二分查找,也能插入,删除的容器
    显然只有 STL::set 能够满足
    将行和列分别建立set数组,每次操作在行和列都执行即可
void solve()
{string s1 = sread(), s2 = sread();int n = s1.length();vector<string> ans;for(int i=0;i<n;i++){if(s1[i] > s2[i]){s1[i] = s2[i];ans.push_back(s1);}}for(int i=n-1;i>=0;i--){if(s1[i]!=s2[i]){s1[i] = s2[i];ans.push_back(s1);}}cout<<ans.size()<<endl;for(auto it:ans) cout<<it<<endl;
}

E - Avoid K Partition

题意:

给定一个数组 \(A\),划分成若干个子区间,使得没有子区间的和为 \(K\)
求划分方案数

思路:

涉及到子区间的和,显然要用到前缀和来优化,预处理一个前缀和数组 pre[N]

  • 线性DP: (会TLE)
    \(f_i\) 表示当前枚举到的连续子序列以 \(i\) 结尾的不同方案数
    • \(i\) 从1到n遍历
    • \(j\) 从0到i-1,pre[i] - pre[j] 即为最后一个子序列的和,若该值不等于K,则将该划分方案加入到 f[i]中
void solve()
{int n = read(), k = read();const int mod = 998244353;vector<int> v(1);for(int i=1; i<=n; i++) v.push_back(read());vector<int> f(n+1),pre(n+1);for(int i=1;i<=n;i++){pre[i] = v[i] + pre[i-1];}f[0] = 1;for(int i=1;i<=n;i++){for(int j=0;j<i;j++){if(pre[j] != pre[i] - k){f[i] = (f[i] + f[j])%mod;}}}cout<<f[n]<<endl;
}
  • 考虑优化,pre[j] 只要不等于 pre[i] - k 即可,因此不需要遍历每个子区间,只需要在所有方案的和中减去子区间和是k的方案即可
    • 用map来存储不同子区间和的方案的个数,即pre[i]的方案个数(方案个数就是符合条件的f[i]的值)
    • 用sum来记录所有子序列的划分方案的和
void solve()
{int n = read(), k = read();vector<int> v(1);for(int i=0;i<n;i++) v.push_back(read());const int mod = 998244353;vector<int> pre(n+1),f(n+1);unordered_map<int,int> cnt;for(int i=1;i<=n;i++) pre[i] = pre[i-1] + v[i];f[0] = 1;cnt[0] = 1;int sum = 1;for(int i=1;i<=n;i++){f[i] = sum - cnt[pre[i] - k];f[i]%=mod, f[i]+=mod, f[i]%=mod;sum = (sum+f[i])%mod;cnt[pre[i]] += f[i];}cout<<f[n]<<endl;
}
  • 注意到:若没有和为 \(K\) 的条件,长度为n的数组划分方案的个数为2的n次方

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

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

相关文章

Qt使用绿色pdf阅读器打开文件

1.下载SumatraPDF 2.设置 3.代码void MainWindow::on_pushButton_clicked() {QProcess *process = new QProcess();QString filePath = "C:\\Users\\jude\\Desktop\\su\\11.pdf";QString sumatraPath = "C:\\Users\\jude\\Desktop\\su\\SumatraPDF-3.5.2-64.exe…

基于tf-idf的论文查重

基于tf-idf的论文查重 github地址:https://github.com/gomevie/gomevie/tree/main这个作业属于哪个课程 广工计院计科34班软工这个作业要求在哪里 作业要求 这个作业的目标 设计并实现一个论文查重算法,通过比较原文和抄袭版论文文件,计算并输出重复率。PSP表格PSP2.1 Pers…

Java SE 语法学习

JavaSE 语法 java数据类型基本数据类型整数类型byte 占1个字节,范围:-128-127 short占2个字节,范围:-32768-32767 int占4个字节,范围:-2147483648-2147483647 long占8个字节,范围:-9223372036854775808-9223372036854775807浮点数类型double占8个字节 float占4个字节字…

今天学习和总结

学习了简单的算法知识排序中的快速排序,利用分治的思想来实现快速排序,对于前后大小有问题的进行swap的交换位置,这是基本的模版和源码 include using namespace std; define N 1000100 int A[N]; void quick_sort(int a,int b){ if(a>=b)return ; int i=a-1,j=b+1,x=A[a+b&…

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

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

痞子衡嵌入式:在MDK开发环境下自定义安装与切换不同编译器版本的方法

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在MDK开发环境下自定义安装与切换不同编译器版本的方法。Keil MDK 想必是嵌入式开发者最熟悉的工具之一了,自 2005 年 Arm 公司收购 Keil 公司之后,MDK 就走上了发展快车道,从 v2.50a 一路狂奔到现在最新的…

思源笔记-S3-七牛云-多设备同步

文档参考:思源笔记配置 S3 同步、思源笔记使用七牛云 编写日期:2024.9.9一、思源笔记安装思源笔记官方下载地址选择对应系统版本进行下载双击【SiYuan Installer.exe】进行安装二、注册账号注册账号是为了购买订阅,订阅后才提供 S3/WEBDAV 同步功能打开 SiYuan点击左上角-「…

JMeter性能测试快速入门

1.安装Jmeter Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量。 1.1.下载 可以Apache Jmeter官网下载,地址:http://jmeter.apache.org/download_jmeter.cgi 1.2.解压 因为下载的是zip包,解压缩即可使用,目录结构如下:其中的bin目录就是执行…

基于Axis 1.4的Web Service入门

最近有个客户使用的是Axis 1.4创建的Web Service,很久没用了,所以整理下这块的知识。 基于JDK 1.8和Eclipse Mars开发一个简单的Hello world Web Service public interface HelloService {String hello(String name);} public class HelloServiceImpl implements HelloServic…

第四周作业

1、安装burp并实现抓取HTTP站点的数据包(HTTPS站点暂时不要求) 下方练习已完成 2、练习Tomcat PUT方法任意写文件漏洞(CVE-2017-12615),提供蚁剑连接成功截图 # 搜索镜像 docker search cve-2017-12615 # 拉取镜像 docker pull cved/cve-2017-12615 # 查看该镜像的详细信息…

MIT6.824 课程-Raft

Fault Tolerance - Raft 容错模式 我们已经学习了以下几种容错模式(fault-tolerance pattern):计算冗余:MapReduce,但是所有计算由单点 Master 进行调度。 数据冗余:GFS,也是依赖单点 Master 来对多个副本进行选主。 服务冗余:VMware-FT 依赖单个 TestAndSet 操作可以看…