AtCoder ABC 369题解

news/2024/9/19 22:07:35/文章来源:https://www.cnblogs.com/sxloiblog/p/18395477

前言

本题解部分思路来源于网络,仅供参考

A - 369

题目大意

给定 \(A\)\(B\) 两个整数,求有多少个整数 \(x\) 使得

  • 可以通过某种排列使得 \(A\)\(B\)\(x\) 为等差数列。

解题思路

稍加分析即可得到:

  • 如果 \(A = B\) 则结果为 \(1\)

  • 如果 \(A = B\)\((A + B) \bmod 2 = 1\) 则结果为 \(2\)

  • 否则,结果为 \(3\)

code

#include <bits/stdc++.h>
using namespace std;
int main() {int a, b;scanf("%d%d", &a, &b);if (a == b) printf("1\n");else if ((a + b) % 2 == 1) printf("2\n");else printf("3\n");return 0;
}

B - Piano 3

题目大意

高桥有一架有 \(100\) 个键的钢琴,给定一个操作序列,按如下操作计算出操作完成后的疲劳程度。

  • 当手从 \(a\) 移动到 \(b\) 时,疲劳程度增加 \(\left| a-b \right|\)

解题思路

根据题目模拟即可。

code

#include <bits/stdc++.h>
using namespace std;
int main() {int flag1 = 1, flag2 = 1, ll, lr, ans = 0;int a, n;char c;scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d %c", &a, &c);if (c == 'L') {if (flag1) {ll = a;flag1 = 0;} else {ans += abs(a - ll);ll = a;}} else {if (flag2) {lr = a;flag2 = 0;} else {ans += abs(a - lr);lr = a;}}}printf("%d\n", ans);return 0;
}

C - Count Arithmetic Subarrays

题目大意

给定长度为 \(N\) 的数列 \(\left(A_1,A_2,...\ ,A_N\right)\) ,求有多少个数对 \((l,r)\quad1 \leqslant l \leqslant r \leqslant N\) 使得数列 \((A_l,A_{l + 1},...\ ,A_r)\) 为等差数列。

解题思路

可以通过遍历一遍数组,查找每个等差数列,然后组合计数。具体见代码。

code

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {int n;int ans = 0, la, d = 0x3f3f3f3f, a, cnt = 1;scanf("%lld%lld", &n, &la);for (int i = 2; i <= n; i++) {scanf("%lld", &a);if (a - la != d) {ans += cnt * (cnt - 1) / 2 + cnt - 1;cnt = 2;d = a - la;} else {cnt++;}la = a;}ans += cnt * (cnt - 1) / 2 + cnt;printf("%lld\n", ans);return 0;
}

D - Bonus EXP

题目大意

高桥打怪,如果这是打的第偶数个怪物,则获得双倍积分,否则只获得一份积分。放走怪物不获得积分。求如何获得最大积分?

解题思路

题目可以整理成如下图:

\(i\) 列节点(从 \(0\) 开始标号)代表在杀死或放走第 \(i\) 只怪物后获得的积分总数。第 \(1/2\) 行节点代表 \(1/2\) 倍的积分。只要填好每一个节点上的数,就可以求出答案。

code

#include <bits/stdc++.h>
using namespace std;
long long dp[200005][2];
signed main() {int n;scanf("%d", &n);dp[0][1] = -0x3f3f3f3f;for (int i = 1, a; i <= n; i++) {scanf("%d", &a);for (int j = 0; j <= 1; j++) {dp[i][j] = max(dp[i][j], dp[i - 1][j]);dp[i][1 - j] = max(dp[i][1 - j],dp[i - 1][j] + a * (j + 1));}}printf("%lld\n", max(dp[n][0], dp[n][1]));return 0;
}

E - Sightseeing Tour

题目大意

给定一个图,想从 \(1\) 节点走到 \(N\) 节点,但是有几条路径必须经过,求最短路径。

解题思路

可以先对这个图进行 Floyed 求出两个节点之间的关系,然后枚举每一条钦定路径的顺序,方向,求出每一种方案的最短路径,最后输出长度最短的结果。

code

#include <bits/stdc++.h>
#include <climits>
#include <cstdio>
using namespace std;
using ll = long long;
ll dis[405][405];
ll u[200005], v[200005], w[200005];
int main() {int n, m;scanf("%d%d", &n, &m);memset(dis, 0x3f, sizeof(dis));for (int i = 1; i <= n; i++) {dis[i][i] = 0;}for (int i = 1; i <= m; i++) {scanf("%lld%lld%lld", &u[i], &v[i], &w[i]);dis[v[i]][u[i]] = dis[u[i]][v[i]] =min(dis[u[i]][v[i]], w[i]);}for (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dis[i][j] =min(dis[i][j], dis[i][k] + dis[k][j]);}}}int q;scanf("%d", &q);while (q--) {int k, id[6];scanf("%d", &k);for (int i = 1; i <= k; i++) {scanf("%d", id + i);}sort(id + 1, id + 1 + k);ll ans = LLONG_MAX;do {for (int j = 0; j < (1 << k); j++) {ll cur = 0;for (int i = 1; i <= k; i++) {cur += w[id[i]];}for (int i = 1; i <= k + 1; i++) {cur += dis[i == 1 ? 1: (j >> (i - 2)) & 1? v[id[i - 1]]: u[id[i - 1]]][i > k ? n: (j >> (i - 1)) & 1? u[id[i]]: v[id[i]]];}ans = min(ans, cur);}} while (next_permutation(id + 1, id + 1 + k));printf("%lld\n", ans);}return 0;
}

F - Gather Coins

题目大意

给定一个表格,表格上有一些金币,经过有金币的格子会自动拾取金币,而且只能向下的向右行走,求怎么走可以使拾取的金币最多,并输出最多可以拾取的金币数量。

解题思路

这道题是一道动态规划,令 \(dp_i\) 为遇到第 \(i\) 个金币时,最大拾取的金币个数。

因为第 \(i - 1\) 个金币在第 \(i\) 个金币的左上方,所以可以把所有金币按横轴排序,至于纵轴,可以通过树状数组维护。有了第 \(i\) 个节点左上方的金币个数,则动态转移方程为:

\[dp_i = \max \limits_{\substack{x_j \leqslant x_i \\ y_j \leqslant x_i}}\left\{dp_j\right\} \]

code

#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
using PII = pair<int, int>;
int h, w, n;
PII p[200005], dp[200005];
PII f[200005];
void modify(PII x, int pos) {while (pos <= w) {f[pos] = max(f[pos], x);pos += pos & -pos;}
}
PII query(int pos) {PII res{-1, 0};while (pos) {res = max(res, f[pos]);pos -= pos & -pos;}return res;
}
int main() {scanf("%d%d%d", &h, &w, &n);for (int i = 1; i <= n; i++)scanf("%d%d", &p[i].fi, &p[i].se);p[0] = {1, 1};p[n + 1] = {h, w};sort(p + 1, p + 1 + n);for (int i = 1; i <= n; i++) {f[i] = {INT_MIN, 0};}modify(dp[0], 1);for (int i = 1; i <= n + 1; i++) {dp[i] = query(p[i].se);modify({++dp[i].fi, i}, p[i].se);}printf("%d\n", dp[n + 1].fi - 1);string ans;for (int i = n + 1; i; i = dp[i].se) {for (int j = 1; j <= p[i].fi - p[dp[i].se].fi; j++)ans += 'D';for (int j = 1; j <= p[i].se - p[dp[i].se].se; j++)ans += 'R';}reverse(ans.begin(), ans.end());cout << ans << endl;return 0;
}

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

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

相关文章

三路快速排序

// 快速排序 function quickSort(arr) {if (arr.length <= 1) {return arr;}const pivot = arr[0];const left = [];const right = [];for (let i = 1; i < arr.length; i++) {if (arr[i] < pivot) {left.push(arr[i]);} else {right.push(arr[i]);}}return quickSort…

三路排序

// 快速排序 function quickSort(arr) {if (arr.length <= 1) {return arr;}const pivot = arr[0];const left = [];const right = [];for (let i = 1; i < arr.length; i++) {if (arr[i] < pivot) {left.push(arr[i]);} else {right.push(arr[i]);}}return quickSort…

8.30 ~ 9.8

文化课奥赛8.30 返校日。 又回到了原来的班(和化奥一个班),一个班有 69 个人; 然后我坐在最角上 🙃 第二天还要开学考试,还有 60% 的原题,这我拿头靠考啊; 遂摆。 发现了坐最后面的好处:离得远老师看不到。 8.31 开学考试。 考试顺序:语 \(\to\) 物 \(\to\) 数 \(\t…

【Spring Boot】整合MyBatis

**整合MyBatis**前言 Spring Boot和MyBatis都是非常流行的Java框架。Spring Boot简化了Spring应用的开发,而MyBatis则是一个优秀的持久层框架,支持自定义SQL、存储过程以及高级映射。 mybatis官方文档:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconf…

C#设计模式入门实战教程

什么是设计模式 设计模式是对面向对象设计中反复出现的问题的解决方案。它们提供了被反复使用、多数人知晓的、经过分类编目的代码设计经验总结。 设计模式的作用提高代码的可重用性:通过定义一套标准的解决方案,设计模式使得相同或类似的问题可以在不同的项目中复用相同的代…

ES安装

1.初识elasticsearch Elasticsearch的官方网站如下: https://www.elastic.co/cn/elasticsearch/ 1.1.认识和安装 Elasticsearch是由elastic公司开发的一套搜索引擎技术,它是elastic技术栈中的一部分。完整的技术栈包括:Elasticsearch:用于数据存储、计算和搜索 Logstash/Be…

java-URLDNS 链条审计

java-URLDNS 链条审计 URLDNS 链条,是我们学习 java 反序列化的启蒙链条,通过 java 内置的类函数调用,达到 DNS 外带数据的目的。 首先让我们来看一个小实验 从 dnslog.cn 平台获取一个域名 public class urlDNS {public void URL() throws UnknownHostException {InetAddre…

进程间通信——消息队列(通俗易懂)

消息队列 概念消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺陷。消息队列包括 POSIX 消息队列和 System V 消息队列。消息队列是 UNIX 下不同进程之间实现共享资源的一种机制,UN…

我克隆了我自己,数字生命有什么意义?

个人语音模型、个人视频模型、个人LLM语言模型都是基于开源的项目,但是需要进行少量的代码修改和集成的工作,这个过程不说很艰难,但是确实遇到很多问题。1. 场景... 2 2. 数字生命意义... 2 3. 具体实现思路... 4 1. 场景孩子:爸爸,今天天气不错,我们一起去打篮球吧?!…

Python批量分割Excel后逐行做差、合并文件的方法

本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,首先依据某一列数据的特征截取我们需要的数据,随后对截取出来的数据逐行求差,并基于其他多个文件夹中同样大量的Excel表格文件,进行数据跨文件合并的具体方法~本文介绍基于Python语言,针…

手动脱壳学习笔记1----手动脱upx壳

ESP定律脱壳 例题 https://files.buuoj.cn/files/ee7f29503c7140ae31d8aafc1a7ba03f/attachment.tar 两下F9按一下F9,ESP变红在ESP处右键在内存窗口处转到在下面的内存下硬件断点再按一下F9在401280处下断点scylla插件输入00401820最后处理

我的第一次随笔

软件工程 https://edu.cnblogs.com/campus/fzu/SE2024/join?id=CfDJ8AOXHS93SCdEnLt5HW8VuxRT6AQqVs0mNHhOMFCtt8IMscU6Av_iCXeJ1yrZksLek4Sb4eQ33ielNgQZ17WNvtTHzyIIaHFdy4c1XbJ0CE2yknMRYdVBQ0jOrgoKTOKwvcAZuUiQqpoOYBFbKCcvozo要求 https://edu.cnblogs.com/campus/fzu/S…