AtCoder Beginner Contest 370 ABCD题详细题解(C++,Python)
前言:
本文为AtCoder Beginner Contest 370 ABCD题的详细题解,包含C++,Python语言描述,觉得有帮助或者写的不错可以点个赞
个人感觉D比C简单,C那里的字典序有点不理解, E应该是前缀和加dp,但是是dp不明白,等我明白了会更新的(好像拖了好多东西了)
目录
题A:
题目大意和解题思路:
代码(C++):
代码(Python):
题B:
题目大意和解题思路:
代码(C++):
代码(Python):
题C:
题目大意和解题思路:
代码(C++):
代码(Python):
题D:
题目大意和解题思路:
代码(C++):
代码(Python):
题A:
A - Raise Both Hands (atcoder.jp)
题目大意和解题思路:
如果只举起一只手,如果他想吃章鱼烧就输出Yes,如果他不想吃就输出No。如果他举起两只手或者一只手都不举,就输出Invalid
简单的if else判断
可以用三元运算符优化
代码(C++):
int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int a, b;std::cin >> a >> b;std::string res = (a == 1 && b == 0 ? "Yes" : a == 0 && b == 1 ? "No" : "Invalid");std::cout << res << "\n";
}
代码(Python):
def main():a, b = map(int, input().split())res = "Yes" if a == 1 and b == 0 else "No" if a == 0 and b == 1 else "Invalid"print(res)
题B:
B - Binary Alchemy (atcoder.jp)
题目大意和解题思路:
有N种元素,编号为1, 2, ..., N。
这些元素可以相互组合。当元素i和j组合时,如果i≥j,它们会变成元素A[i,j];如果i<j,它们会变成元素A[j,i]。
从元素1开始,按顺序将它与元素1, 2, ..., N组合。找出最终得到的元素。
题目意思其实很简单,就是最开始是1跟1比较,然后比较的数字大小决定了下一个坐标
比如示例一:
4 3 2 4 3 1 2 2 1 2 4
最开始1跟1比较,得到A11,也就是 3
然后3跟2比较,得到A32,也就是1
然后1跟3比较,得到A31,也就是3
最后3跟4比较,得到A43,也就是2
根据上面可以得到,大的坐标在前面,小的坐标在后面
然后可以模拟,输入的放入n + 1长度的二维数组,下标从1开始,然后答案定义为1,详细见代码:
代码(C++):
int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int n;std::cin >> n;std::vector<std::vector<int>> A(n + 1, std::vector<int> (n + 1));for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {std::cin >> A[i][j];}}//开始为1int res = 1;//依次跟1 到 n 进行比较 大的那一个为A的第一个下标for (int i = 1; i <= n; i++) {res = A[std::max(res, i)][std::min(res, i)];}std::cout << res << "\n";
}
代码(Python):
def main():n = int(input())A = [[0 for _ in range(n + 1)] for _ in range(n + 1)]for i in range(1, n + 1):row = list(map(int, input().split()))for j in range(1, i + 1):A[i][j] = row[j - 1]res = 1for i in range(1, n + 1):res = A[max(res, i)][min(res, i)]print(res)
题C:
C - Word Ladder (atcoder.jp)
题目大意和解题思路:
让 X 为一个空数组,重复以下操作直到 S 等于 T:
- 改变 S 中的一个字符,并将改变后的 S 添加到 X 的末尾。
找出通过这种方式得到的元素数量最少的字符串数组 X。如果有多个这样的最小元素数量的数组,找出其中字典序最小的一个。
什么是字符串数组的字典序?
长度为 N 的字符串 S=S₁S₂...Sₙ 在字典序上小于长度为 N 的字符串 T=T₁T₂...Tₙ,如果存在一个整数 1≤i≤N,满足以下两个条件:
- S₁S₂...Sᵢ₋₁ = T₁T₂...Tᵢ₋₁
- Sᵢ 在字母表中比 Tᵢ 更早出现。
具有 M 个元素的字符串数组 X=(X₁,X₂,...,Xₘ) 在字典序上小于具有 M 个元素的字符串数组 Y=(Y₁,Y₂,...,Yₘ),如果存在一个整数 1≤j≤M,满足以下两个条件:
- (X₁,X₂,...,Xⱼ₋₁) = (Y₁,Y₂,...,Yⱼ₋₁)
- Xⱼ 在字典序上小于 Yⱼ。
题目的意思就是把s变成t,一次只能变换一个字母,然后每次变换后把变换的字符串放入x中
并且使得x的字符串尽可能小
就是把缩小的变换都放在前面,增大的变换都放在后面,当前也不知道为啥卡这么久,脑子发昏了
代码(C++):
int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);std::string s, t;std::cin >> s;std::cin >> t;int n = s.size();std::vector<std::string> A;for (int i = 0; i < n; i++) {if (s[i] > t[i]) {s[i] = t[i];A.push_back(s);}}for (int i = n - 1; i >= 0; i--) {if (s[i] < t[i]) {s[i] = t[i];A.push_back(s);}}std::cout << A.size() << "\n";for (auto a : A) {std::cout << a << "\n";}
}
代码(Python):
def main():s = list(input().strip())t = list(input().strip())n = len(s)A = []for i in range(n):if s[i] > t[i]:s[i] = t[i]A.append(''.join(s))for i in range(n - 1, -1, -1):if s[i] < t[i]:s[i] = t[i]A.append(''.join(s))print(len(A))for a in A:print(a)
题D:
D - Cross Explosion (atcoder.jp)
题目大意和解题思路:
题目意思就是说,有一个 H 行 W 列的网格图,在每个单元格里面都有一个墙,
然后放炸弹,如果这个单元格有墙,那就炸
如果没有,那就同时摧毁从该位置向上、下、左、右看到的第一面墙
根据题目的意思很容易得到暴力模拟代码:
超时代码:
int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int H, W, Q;std::cin >> H >> W >> Q;std::vector<std::vector<bool>> A(H, std::vector<bool>(W, true));for (int q = 0; q < Q; q++) {int r, c;std::cin >> r >> c;r--; c--;if (A[r][c]) {A[r][c] = false;continue;}for (int i = r - 1; i >= 0; i--) {if (A[i][c]) {A[i][c] = false;break;}}for (int i = r + 1; i < H; i++) {if (A[i][c]) {A[i][c] = false;break;}}for (int j = c + 1; j < W; j++) {if (A[r][j]) {A[r][j] = false;break;}}for (int j = c - 1; j >= 0; j--) {if (A[r][j]) {A[r][j] = false;break;}}}int res = 0;for (int i = 0; i < H; i++) {for (int j = 0; j < W; j++) {if (A[i][j]) {res++;}}}std::cout << res << "\n";
}
上面代码复杂度为O(H * W + Q * (H + W))
而题目给的是10^5,肯定会超时的
可以用set进行优化,使用四个集合存储每一行和每一列中墙壁的位置
由于是找从该位置向上、下、左、右看到的第一面墙,那么可以想到二分查找
代码(C++):
int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);int H, W, Q;std::cin >> H >> W >> Q;// 使用四个集合存储每一行和每一列中墙壁的位置std::vector<std::set<int>> rows(H), cols(W);for (int i = 0; i < H; i++) {for (int j = 0; j < W; j++) {rows[i].insert(j);cols[j].insert(i);}}// 定义remove_wall,方便操作auto remove_wall = [&](int r, int c) {rows[r].erase(c);cols[c].erase(r);};for (int q = 0; q < Q; q++) {int r, c;std::cin >> r >> c;r--; c--;if (rows[r].count(c)) {remove_wall(r, c);continue;}auto it = rows[r].lower_bound(c);if (it != rows[r].begin()) {int j = *(--it);remove_wall(r, j);}it = rows[r].upper_bound(c);if (it != rows[r].end()) {int j = *it;remove_wall(r, j);}it = cols[c].lower_bound(r);if (it != cols[c].begin()) {int i = *(--it);remove_wall(i, c);}it = cols[c].upper_bound(r);if (it != cols[c].end()) {int i = *it;remove_wall(i, c);}}int res = 0;for (int i = 0; i < H; i++) {res += rows[i].size();}std::cout << res << "\n";return 0;
}
相关文章:
AtCoder Beginner Contest 370 ABCD题详细题解(C++,Python)
前言: 本文为AtCoder Beginner Contest 370 ABCD题的详细题解,包含C,Python语言描述,觉得有帮助或者写的不错可以点个赞 个人感觉D比C简单,C那里的字典序有点不理解, E应该是前缀和加dp,但是是dp不明白,等我明白了会更…...
斯坦福研究人员探讨大型语言模型在社交网络生成中的应用及其在政治同质性上的偏见
社交网络生成在许多领域有着广泛的应用,比如流行病建模、社交媒体模拟以及理解社交现象如两极化等。当由于隐私问题或其他限制无法直接观察真实网络时,创建逼真的社交网络就显得尤为重要。这些生成的网络对于在这些情况下准确建模互动和预测结果至关重要…...

一招教你找到Facebook广告的最佳发帖时间
在社交媒体上做广告时,时机是至关重要的。有时候你投放的广告参与度低,很有可能是因为你没有在适当的时机投放广告。这篇文章会教你如何找到适合自己的广告投放时间,如果你感兴趣的话,就继续看下去吧! 首先࿰…...

【数据库】MySQL-基础篇-多表查询
专栏文章索引:数据库 有问题可私聊:QQ:3375119339 目录 一、多表关系 1.一对多 2.多对多 3.一对一 二、多表查询概述 1.数据准备 2.概述 3.分类 三、内连接 1.隐式内连接 2.显式内连接 3.案例 四、外连接 1.左外连接 2.右外连…...

MongoDB事务机制
事务机制 1.事务概念 在对数据的操作的过程中,涉及到一连串的操作,这些操作如果失败,会导致我们的数据部分变化了,部分没变化。这个过程就好比如你去吃早餐,你点完餐了,并且吃完早餐了,没付钱你…...

大模型 LLM(Large Language Models)如今十分火爆,对于初入此领域的新人小白来说,应该如何入门 LLM 呢?是否有值得推荐的入门教程呢?
前言 很明显,这是一个偏学术方向的指南要求,所以我会把整个LLM应用的从数学到编程语言,从框架到常用模型的学习方法,给你捋一个通透。也可能是不爱学习的劝退文。 通常要达到熟练的进行LLM相关的学术研究与开发,至少…...
Python实现模糊逻辑算法
博客目录 引言 什么是模糊逻辑?模糊逻辑的应用场景模糊逻辑的基本思想 模糊逻辑的原理 模糊集合与隶属函数模糊推理系统(FIS)模糊规则和推理过程 Python实现模糊逻辑算法 面向对象的设计思路代码实现示例与解释 模糊逻辑算法应用实例&…...

MATLAB、FPGA、STM32中调用FFT计算频率、幅值及相位差
系列文章目录 文章目录 系列文章目录前言MATLABSTM32调用DSPSTM32中实现FFT关于初相位 FPGA 前言 最近在学习如何在STM32中调用FFT MATLAB 首先对FFT进行一下说明,我们输入N个点的数据到FFT中,FFT会返回N个点的数据,这些数据都是复数&#…...

基于SSM的医院药品库存系统的设计与实现---附源码76620
摘要 医院药品库存管理是医院管理的重要组成部分,对于保障医疗服务的质量和效率具有重要意义。传统的手工管理方式已经无法满足药品库存管理的需求,因此建立一个医院药品库存系统具有重要的实践价值。 使用Java语言开发医院药品库存系统可以兼容不同操作…...
Jupyter管理内核命令
1.显示有哪些内核 jupyter kernelspec list2.删除某个内核 jupyter kernelspec remove xxx3.添加某个内核 先激活环境 conda activate test_env然后安装ipykernel包 pip install ipykernel在虚拟环境中安装ipykernel包 python -m ipykernel install --name test_env安装过…...

简单分享-获取.txt文件内数据 文件内数据逗号分隔 分隔符 C语言
简单分享-获取.txt文件内数据 文件内数据逗号分隔 分隔符 C语言 数据存储到文件中,把文件数据读取到数组,方便数据处理。 # include <stdio.h> # include <stdlib.h> # include <string.h>#define DATANUM 307200 //数组个数 int ma…...

从0开始手把手带你入门Vue3
前言 本文并非标题党,而是实实在在的硬核文章,如果有想要学习Vue3的网友,可以大致的浏览一下本文,总体来说本篇博客涵盖了Vue3中绝大部分内容,包含常用的CompositionAPI(组合式API)、其它CompositionAPI以及一些新的特…...

C# USB通信技术(通过LibUsbDotNet库)
文章目录 1.下载LibusbDotNet库2.引入命名空间3. 实例化USB设备4.发送数据5.关闭连接 1.下载LibusbDotNet库 右击项目选择管理NuGet程序包在弹出的界面中搜索LibusbDotNet,然后下载安装。 2.引入命名空间 using LibUsbDotNet; using LibUsbDotNet.Main;3. 实例化…...
常用Java API
1 字符串处理 1.1 String 类 String 类是 Java 中不可变的字符序列。它提供了以下常用方法: length():返回字符串的长度。 charAt(index):返回指定索引处的字符。 substring(startIndex, endIndex):返回从 startIndex 到 endI…...

使用opencv优化图片(画面变清晰)
文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强…...

Java 回顾方法的定义
一、方法的定义 1.修饰符(public static…)详见博客【Java 方法的定义】 2.返回值(int, double, char[],…., void)详见博客【Java 方法的定义】 3. break:跳出switch 结束循环,详…...

网络安全产品认证证书大全(持续更新...)
文章目录 一、引言二、《计算机信息系统安全专用产品销售许可证》2.1 背景2.2 法律法规依据2.3 检测机构2.4 检测依据2.5 认证流程2.6 证书样本 三、《网络关键设备和网络安全专用产品安全认证证书》3.1 背景3.2 法律法规依据3.3 检测机构3.4安全认证和安全检测依据标准3.5 认证…...

win10 安装多个版本的python
1,安装python3.9 和python3.10 2, 安装完之后分别打开两个版本的Python的安装目录(第一层目录),把pythonw.exe分别重命名为pythonw_39.exe和pythonw_310.exe,把python.exe复制一份,并分别重命名为python_…...
【ORACLE】数据备份
Oracle数据库备份是确保数据安全和可靠性的重要环节。Oracle提供了多种备份方法,包括冷备份、热备份、逻辑备份(如使用expdp和impdp)以及使用RMAN(Recovery Manager)进行物理备份。 冷备份:在数据库关闭的状…...

[Golang] goroutine
[Golang] goroutine 文章目录 [Golang] goroutine并发进程和线程协程 goroutine概述如何使用goroutine 并发 进程和线程 谈到并发,大多都离不开进程和线程,什么是进程、什么是线程? 进程可以这样理解:进程就是运行着的程序&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...