当前位置: 首页 > news >正文

ABC344 A-E题解

文章目录

  • A
    • 题目
    • AC Code:
  • B
    • 题目
    • AC Code:
  • C
    • 题目
    • AC Code:
  • D
    • 题目
    • AC Code:
  • E
    • 题目
    • AC Code:

不易不难,写到5题很简单,但是要有足够的思维能力。

A

题目

我们用一个 flag 变量记录我们是不是在两个竖杠之间,如果是,就不能输出这个字符,否则如果这个字符不是竖杠,就输出这个字符。

AC Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>
using namespace std;
string s;
bool flag = 0;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> s;for (int i = 0; i < (int)s.size(); i++) {if (s[i] == '|') flag = !flag;if (!flag && s[i] != '|') cout << s[i];}return 0;
}

B

题目

一直输入 a n a_n an,然后让 n n n 加上 1 1 1,如果 a n a_n an 0 0 0 就跳出输入循环。最后倒着输出数组内容即可。

AC Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>
using namespace std;
int a[2001];
int n = 1;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> a[n];while (a[n]) {n++;cin >> a[n];}for (int i = n; i >= 1; i--) cout << a[i] << '\n';return 0;
}

C

题目

与其输入一个数后寻找合适的三个数,不如与处理处可行的数。对于可行的三个数,我们将这三个数的和标记为 1 1 1,对于每一个询问,如果这个数的标记为 1 1 1 就说明有三个数的和是询问的的数。

AC Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>
using namespace std;
int n, m, l;
int a[110], b[110], c[110];
int q;
map<int, bool> mp;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];cin >> m;for (int i = 1; i <= m; i++) cin >> b[i];cin >> l;for (int i = 1; i <= l; i++) cin >> c[i];for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {for (int k = 1; k <= l; k++) {mp[a[i] + b[j] + c[k]] = 1;}}}cin >> q;while (q--) {int x;cin >> x;if (mp[x]) cout << "Yes\n";else cout << "No\n";}return 0;
}

D

题目

又是一个炸裂的 D。

此题可以用动态规划来解决。我们用 d p i j dp_{ij} dpij 来表示处理到第 i i i 排后使前 j j j 个字符相等的花费。一开始除了 d p 00 dp_{00} dp00 0 0 0 外,其他都为 ∞ \infin 。 很明显,如果当前字串 s s s k k k,且 ∑ i = 1 k [ s i = t i + j − 1 ] = k \sum_{i=1}^k[s_i=t_{i+j-1}]=k i=1k[si=ti+j1]=k,即此字串从 j j j j + k − 1 j+k-1 j+k1 的位置都匹配,那么 d p 当前处理排数 j + k − 1 = min ⁡ ( d p 当前处理排数 j + k − 1 , d p 上一排 j − 1 + 1 ) dp_{当前处理排数j+k-1}=\min(dp_{当前处理排数j+k-1}, dp_{上一排j-1}+1) dp当前处理排数j+k1=min(dp当前处理排数j+k1,dp上一排j1+1)。迁移到下一排时,对于每一个 0 ≤ i ≤ ∣ t ∣ 0\le i\le|t| 0it d p 当前拍数 i = d p 上一排 i dp_{当前拍数i}=dp_{上一排i} dp当前拍数i=dp上一排i。注意 i i i 的范围,因为 d p x 0 dp_{x0} dpx0 也在讨论范围。我曾经在这里挂了10次

AC Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>
using namespace std;
char t[200];
int n;
int a[200];
char s[200][20][20];
int dp[200][200];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> (t + 1) >> n;for (int i = 1; i <= n; i++) {cin >> a[i];for (int j = 1; j <= a[i]; j++) cin >> (s[i][j] + 1);}int lent = strlen(t + 1);memset(dp, 0x3f, sizeof(dp));dp[0][0] = 0;for (int i = 1; i <= n; i++) {for (int j = 0; j <= lent; j++) {dp[i][j] = min(dp[i][j], dp[i - 1][j]);}for (int j = 1; j <= a[i]; j++) {int len = strlen(s[i][j] + 1);for (int k = lent - len + 1; k >= 1; k--) {if (dp[i - 1][k - 1] != 0x3f3f3f3f) {bool flag = 0;for (int l = k; l < len + k; l++) {if (s[i][j][l - k + 1] != t[l]) {flag = 1;break;}}if (!flag) {dp[i][k + len - 1] = min(dp[i][k + len - 1], dp[i - 1][k - 1] + 1);}}}}}if (dp[n][lent] != 0x3f3f3f3f) cout << dp[n][lent];else cout << -1;return 0;
}

E

题目

题目中说到:

Its elements will be distinct.
每一个元素都不一样。

说明我么可以记录某个数值的后面一个元素是什么,前一个元素是什么……

然后我们可以惊奇的发现这东西就是一个链表。

实现一个双链表,第一个数必须是一个不在 A A A 里面的数,最后一个数也不能在 A A A 里面。这样做是为了方便删除。

如果你不会链表那么请看下面:

首先,用两个数组记录下每一个数值的上一个元素和下一个元素是什么。元素太大怎么办?键值对形式的数据结构是个好东西!(即 C++ 中的 map。)要创建一个链表,我们对于每一个 1 ≤ i ≤ N 1\le i\le N 1iN A i A_i Ai,将其上一个设为 A i − 1 A_{i-1} Ai1,将其后一个设为 A i + 1 A_{i+1} Ai+1,当然,将 A 0 A_0 A0 设为 0 0 0 A N + 1 A_{N+1} AN+1 设为 − 1 -1 1 就方便操作了,当然不要忽略这两个节点的下一个和上一个!

要增加一个元素 y y y x x x 后面,首先,备份一个 x x x 的下一个,将 x x x 的下一个设为 y y y y y y 的下一个设为原来 x x x 的下一个,将 y y y 的上一个设为 x x x,将原来 x x x 的下一个的上一个设为 y y y

要删除一个元素 p p p,我们将 p p p 的上一个的下一个设为 p p p 的下一个,将 p p p 的下一个的上一个设为 p p p 的上一个。

要输出这个链表,先从 0 0 0 的下一个开始,一直跳到下一个,如果下一个是 − 1 -1 1 就跳出,否则,输出这个数。

建议用 C++ 编写代码,因为 A i A_i Ai 的范围较大,用较慢的 python 可能会超出时间限制。

AC Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>
using namespace std;
int n, a[200100], q;
map<int, int> lst, nxt;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];a[n + 1] = -1;for (int i = 1; i <= n; i++) {lst[a[i]] = a[i - 1];nxt[a[i]] = a[i + 1];}nxt[0] = a[1];lst[-1] = a[n];cin >> q;while (q--) {int op;cin >> op;if (op == 2) {int x;cin >> x;nxt[lst[x]] = nxt[x];lst[nxt[x]] = lst[x];}else {int x, y;cin >> x >> y;int p = nxt[x];nxt[x] = y;lst[y] = x;nxt[y] = p;lst[p] = y;}}int now = nxt[0];while (now != -1) {cout << now << ' ';now = nxt[now];}cout << '\n';return 0;
}

相关文章:

  • 三、N元语法(N-gram)
  • Foreign Exchange(UVA 10763)
  • D2力扣滑动窗口系列
  • C++ inline关键字总结
  • C++读写Excel(xlnt库的使用)
  • 用一个 Python 脚本实现依次运行其他多个带 argparse 命令行参数的 .py 文件
  • CTP-API开发系列之三:柜台系统简介
  • RAG综述 《Retrieval-Augmented Generation for Large Language Models: A Survey》笔记
  • jupyter notebook 调整深色背景与单元格宽度与自动换行
  • 权限管理系统-0.2.0
  • 前端vite+vue3——可视化页面性能耗时指标(fmp、fp)
  • 蓝桥杯(3.10)
  • WPF 窗口添加投影效果Effect
  • 数据结构之八大排序
  • 数学建模-动态规划(美赛运用)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • docker-consul
  • Effective Java 笔记(一)
  • express如何解决request entity too large问题
  • nodejs实现webservice问题总结
  • React+TypeScript入门
  • Web Storage相关
  • 从零开始的无人驾驶 1
  • 警报:线上事故之CountDownLatch的威力
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 设计模式 开闭原则
  • 原生Ajax
  • ​决定德拉瓦州地区版图的关键历史事件
  • #Linux(Source Insight安装及工程建立)
  • #Linux(权限管理)
  • (2020)Java后端开发----(面试题和笔试题)
  • (2022 CVPR) Unbiased Teacher v2
  • (39)STM32——FLASH闪存
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (全注解开发)学习Spring-MVC的第三天
  • (转载)从 Java 代码到 Java 堆
  • .gitignore文件设置了忽略但不生效
  • .net core控制台应用程序初识
  • .Net 垃圾回收机制原理(二)
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET性能优化(文摘)
  • .Net中的集合
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .net专家(高海东的专栏)
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d