【cf】Edu Codeforces Round 167(Div.2)题解 A - E

devtools/2024/9/20 7:17:55/ 标签: 算法, c++, 数据结构

文章目录

    • A. Catch the Coin
    • B. Substring and Subsequence(贪心)
    • C. Two Movies(贪心)
    • D. Smithing Skill(贪心+双指针)
    • E. Distance to Different(dp)

A. Catch the Coin

y 小于 -1 就不可能拿到

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;const int N = 1e5 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int a, b;cin >> a >> b;if (b < -1) cout << "NO\n";else cout << "YES\n";
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t--){solve();}
}

B. Substring and Subsequence(贪心)

最坏情况是 a + b,然后,考虑 a 是一定要整段出现在答案中,所以只需要枚举从 b 的第几个字符开始匹配即可,如果有 tmp 个字符匹配,答案就是 a.size() + b.size() - tmp

这题一开始的思路就是对的,为什么wa了很多发呢,因为没注意到 b 中所有字母都要按顺序出现在 a 里,所以,一旦 b 中有一个字符不能和 a 匹配,之后的所有字符都不能和 a 匹配了,直接break,就不能再往下计算了

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;const int N = 1e5 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{string a, b;cin >> a >> b;int ans = a.size() + b.size();for (int k = 0; k < b.size(); k ++ ){int tmp = 0;int lst = -1;for (int i = k; i < b.size(); i ++ ){bool flag = false;for (int j = lst + 1; j < a.size(); j ++ ){if (b[i] == a[j]){flag = true;lst = j;tmp ++ ;break;}}if (!flag) break;}ans = min(ans, (i64)(a.size() + b.size() - tmp));}cout << ans << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t--){solve();}
}

C. Two Movies(贪心)

赛时wa是因为写二分,然后check函数写错了,因为我把同加的数量和两个分数大于mid的部分加在一起作为多余的部分,其实并不是这样,因为第一个分数多出来的部分并不能挪到第二个分数缺少的部分

今天看蒋老师的代码,直接贪心就可以,前面都是一样的,能加就加,遇到同为 1 或者同为 -1 的情况:

  • 同为1,将同加的数量+1
  • 同为-1,将同加的数量+1后,两个分数都-1(思考一下可以发现确实是等价的)

之后最大值就是 第一个分数+同加数量 第二个分数+同加数量 (第一个分数+第二个分数+同加数量)/2 向下取整 三者的最小值

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;const int N = 1e5 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int n;cin >> n;vector<int> a(n + 1), b(n + 1);for (int i = 1; i <= n; i ++ ) cin >> a[i];for (int i = 1; i <= n; i ++ ) cin >> b[i];int cnt1 = 0, cnt2 = 0; // 当前得分int same_plus = 0; // 同加for (int i = 1; i <= n; i ++ ){if (a[i] == b[i]){if (a[i] != 0) same_plus ++ ;if (a[i] == -1){cnt1 -- ;cnt2 -- ;}}else{if (a[i] == 1) cnt1 ++ ;else if (b[i] == 1) cnt2 ++ ;}}int ans = min(cnt1 + same_plus, cnt2 + same_plus);if (cnt1 + cnt2 + same_plus >= 0) ans = min(ans, (cnt1 + cnt2 + same_plus) / 2);else ans = min(ans, (cnt1 + cnt2 + same_plus - 1) / 2);cout << ans << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t--){solve();}
}

D. Smithing Skill(贪心+双指针)

首先需要考虑到,每次锻造会让我们的原料减少,那我们选择锻造方式的时候,一定会在原料数量满足条件的情况下,选择原料减少数量最小的

所以开一个vector,存pair(a[i] - b[i],a[i]),先排序,然后遍历其中的每一个元素,删掉多余的

什么叫做多余的呢,排完序后,当前锻造方式一定比前面的锻造方式减少的原料更多,如果此时它还需要更高的门槛(也就是a[i]还比前面高的话),那我直接选前面的就好了,当前的就是多余的

所以最后我们得到的数组一定是 a[i] - b[i] 单增,a[i] 单减的

之后我们计算有 x (小于1e6)个原料时,能得到的最大经验值,存在 dp[i]

怎么计算呢,使用双指针,i 从前往后遍历表示当前有 i 个原料,j 从后往前遍历表示当前选择第 j 个锻造方式,每次 j 尽可能往前选(因为越前面减少的原料越少,但也不能一直往前,因为只有原料数超过 a[i] 的时候才能使用这种锻造方式),更新方程 dp[i] = dp[i - p[j].first] + 1]

到这里我们得到了原料小于1e6能够得到的经验值,那大于 1e6 的部分怎么办呢,因为每种锻造方法所需要的原料数量都小于 1e6 ,所以一开始一定是先用第一个锻造方法,直到原料数量小于1e6的时候,我们就可以直接使用刚刚求的 dp[i] 计算了

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int n, m;cin >> n >> m;vector<int> a(n), b(n);for (int i = 0; i < n; i ++ ) cin >> a[i];for (int j = 0; j < n; j ++ ) cin >> b[j];vector<PII> p(n);for (int i = 0; i < n; i ++ ) p[i] = {a[i] - b[i], a[i]};sort(p.begin(), p.end());int maxx = 1e9;vector<PII> tmp;for (auto t : p){if (t.second < maxx) // 减少一样多的原料 必须要初始消耗原料更少才保留{tmp.push_back(t);maxx = t.second;}}swap(p, tmp);vector<int> dp(N);for (int i = 0, j = p.size(); i <= 1e6; i ++ ){while (j >= 1 && p[j - 1].second <= i) j -- ;if (j != p.size()) dp[i] = dp[i - p[j].first] + 1;}int ans = 0;while (m -- ){int x; cin >> x;if (x > 1e6){int cnt = (x - 1e6) / p[0].first;x -= cnt * p[0].first;if (x > p[0].second){x -= p[0].first;cnt ++ ;}ans += cnt;} ans += dp[x];}cout << ans * 2 << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;// cin >> t;while (t--){solve();}
}

E. Distance to Different(dp)

解法参考 jiangly 和 cup-pyy

求 b 的数量,可以转化成:将 a 分成几段,每段颜色相同,求这样的分法数量

如果直接这么求也不对,因为我们发现两个相同的颜色组成的一段,处在中间位置时,和两个不同的颜色组成的两段贡献一样,举个例子:1221和1231得到的 b 数组都是 1111,但是这样的相同两个颜色组成的一段处在两段时,贡献就和不同颜色组成的两段不一样,举个例子:112和312得到的 b 数组分别是 211 和 111,所以每次需要减去不处在两端的 由两个相同颜色组成的一段

考虑dp,设计 dp[i][j] 为前 i 个点被分成不少于 j 段的方案数

d p [ i ] [ j ] = ∑ 0 i − 1 d p [ i ] [ j − 1 ] dp[i][j]=\sum_{0}^{i-1}{dp[i][j-1]} dp[i][j]=0i1dp[i][j1]

直接求这个式子复杂度 O ( n 2 ) O(n^2) O(n2),所以定义 sum[i][j] 表示 dp[0][j] ~ dp[i][j] 之和,在每轮循环进行更新

i > 2 i>2 i>2 i ≠ n i \neq n i=n 时,减去 d p [ i − 2 ] [ j ] dp[i-2][j] dp[i2][j]

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;const int N = 1e5 + 10;
const int maxn = 1e6 + 10;
const int mod = 998244353;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int n, k;cin >> n >> k;// dp[i][j] 前i个点分成不少于j段的数量// sum[i][j] dp[0][j]~dp[i][j]之和vector<vector<int>> dp(n + 1, vector<int>(k + 1)), sum(n + 1, vector<int>(k + 1));dp[0][0] = 1;sum[0][0] = 1;for (int i = 1; i <= n; i ++ ){for (int j = 0; j <= k; j ++ ){dp[i][min(j + 1, k)] = (dp[i][min(j + 1, k)] + sum[i - 1][j]) % mod;if (i > 2 && i != n) dp[i][min(j + 1, k)] = (dp[i][min(j + 1, k)] - dp[i - 2][j] + mod) % mod;}for (int j = 0; j <= k; j ++ ){sum[i][j] = (sum[i - 1][j] + dp[i][j]) % mod;}}cout << dp[n][k] << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;// cin >> t;while (t--){solve();}
}

http://www.ppmy.cn/devtools/56222.html

相关文章

Talking Web

1. curl 1.1 http curl http://127.0.0.1:80 向目标主机端口发送http请求 1.2 httphead curl -H “Host: 18ed3df584cd48328b5839443aa7b42b” http://127.0.0.1:80 1.3 httppath curl http://127.0.0.1:80/853c64cd218f80d0a59665666fb2ab80 1.4 URL编码路径 &#xff0…

光学相机市场格局:中国光学相机市场评估及未来发展趋势研究报告

欢迎关注GZH《光场视觉》 光学相机行业定义 光学相机是一种利用光学镜头和感光材料&#xff08;如胶片&#xff09;或数字传感器来捕捉图像的装置。光学相机&#xff0c;也常被称作传统相机或胶片相机&#xff0c;其工作原理基于光的折射和聚焦。当光线通过相机的镜头进入时&…

从我邮毕业啦!!!

引言 时间过的好快&#xff0c;转眼间就要从北邮毕业了&#xff0c;距离上一次月度总结又过去了两个月&#xff0c;故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络&#xff0c;欢迎Star&#xff01; 毕业&#x1f393; 6月1号完成了自己的…

# Kafka_深入探秘者(1):初识 kafka

Kafka_深入探秘者&#xff08;1&#xff09;&#xff1a;初识 kafka 一、kafka 特性 1、Kafka &#xff1a;最初是由 Linkedln 公司采用 Scala 语言开发的一个多分区、多副本并且基于 ZooKeeper 协调的分布式消息系统&#xff0c;现在已经捐献给了 Apache 基金会。目前 Kafka…

【websocket】websocket网课视频记录

仅个人方便回顾。 【WebSocket入门与案例实战-哔哩哔哩】 https://b23.tv/2p1f9t2 课程对应代码仓库: https://gitee.com/duoli-java/websocket-demo.git

[图解]企业应用架构模式2024新译本讲解18-活动记录2

1 00:00:00,940 --> 00:00:04,890 接下来&#xff0c;就是要把这个列表输出到控制台 2 00:00:06,490 --> 00:00:12,280 这里面有3个 3 00:00:15,420 --> 00:00:17,480 Id有了&#xff0c;姓 4 00:00:18,600 --> 00:00:28,500 一个一个取&#xff0c;ID&#xff…

Python 实现Excel转TXT,或TXT文本导入Excel

Excel是一种具有强大的数据处理和图表制作功能的电子表格文件&#xff0c;而TXT则是一种简单通用、易于编辑的纯文本文件。将Excel转换为TXT可以帮助我们将复杂的数据表格以文本的形式保存&#xff0c;方便其他程序读取和处理。而将TXT转换为Excel则可以将文本文件中的数据导入…

不是KVM不支持精简置备的磁盘,而是VMM

正文共&#xff1a;999 字 11 图&#xff0c;预估阅读时间&#xff1a;1 分钟 书接上文&#xff08;不会吧&#xff01;KVM竟然不支持磁盘的精简置备&#xff01;&#xff1f;&#xff09;&#xff0c;我们已经掌握了通过“虚拟系统管理器VMM”创建虚拟机的基本方法&#xff0c…

Kafka Stream 流处理设计概述

Kafka Stream 流处理设计概述 Kafka 流处理是指使用 Kafka 及其生态系统中的组件来处理实时数据流。Kafka Streams 是 Kafka 官方 提供的流处理库,它简化了构建流处理应用程序的过程,并与 Kafka 无缝集成。以下是 Kafka 流处理的设 计原理和相关概念。 1. Kafka 流处理基本…

基于matlab的不同边缘检测算子的边缘检测

1 原理 1.1 边缘检测概述 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;其目的在于标识数字图像中亮度变化明显的点。这些变化通常反映了图像属性的重要事件和变化&#xff0c;如深度不连续、表面方向不连续、物质属性变化和场景照明变化等。边缘检测在特征提取中…

计算机毕业设计Python+Spark知识图谱微博预警系统 微博推荐系统 微博可视化 微博数据分析 微博大数据 微博爬虫 微博预测系统 大数据毕业设计

课题名称 基于Bert模型对微博的言论情感分析设计与实现 课题来源 课题类型 BY 指导教师 学生姓名 专 业 计算机科学与技术 学 号 开题报告内容&#xff1a;&#xff08;调研资料的准备&#xff0c;设计/论文的目的、要求、思路与预期成果&#xff1b;…

【uniapp】上传附件+Java后端

一、背景 移动端项目使用uniapp开发&#xff0c;项目有上传附件的需求。现在分享给大家&#xff0c;一起进步 二、前端 关键代码&#xff1a; uni.chooseFile({type: "all",count: this.count,success: res > {let len 0;res.tempFiles.forEach((item, index…

endswith()方法——是否以指定子字符串结尾

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 endswith()方法用于检索字符串是否以指定子字符串结尾。如果是则返回True&#xff0c;否则返回False。endswith()方法的语法格式如下&…

提升 Selenium 测试稳定性的秘诀:深入理解等待 API 的使用

目录 为什么需要等待Selenium 等待 API 简介隐式等待显式等待Fluent Wait等待策略的选择示例代码总结 正文 1. 为什么需要等待 在 Web 自动化测试中&#xff0c;等待是一个关键因素。网络应用通常是动态的&#xff0c;页面加载时间、元素的显示时间都可能不同步。直接操作这…

DataV大屏组件库

DataV官方文档 DataV组件库基于Vue &#xff08;React版 (opens new window)&#xff09; &#xff0c;主要用于构建大屏&#xff08;全屏&#xff09;数据展示页面即数据可视化&#xff0c;具有多种类型组件可供使用&#xff1a; 源码下载

Matlab中数组详解

在MATLAB中&#xff0c;数组是最基本的数据类型&#xff0c;几乎所有的数据运算都涉及数组操作。下面是对MATLAB中数组的详细解释和操作示例&#xff1a; 数组的创建 一维数组&#xff08;向量&#xff09;&#xff1a; 行向量&#xff1a;用方括号 [ ] 包含元素&#xff0c;元…

OverTheWire Bandit 靶场通关解析(中)

介绍 OverTheWire Bandit 是一个针对初学者设计的网络安全挑战平台&#xff0c;旨在帮助用户掌握基本的命令行操作和网络安全技能。Bandit 游戏包含一系列的关卡&#xff0c;每个关卡都需要解决特定的任务来获取进入下一关的凭证。通过逐步挑战更复杂的问题&#xff0c;用户可…

力扣每日一题 6/28 动态规划/数组

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2742.给墙壁刷油漆【困难】 题目&#xff1a; 给你两个长度为 n 下标从 0…

使用Spring Boot创建自定义Starter

使用Spring Boot创建自定义Starter 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何使用Spring Boot创建自定义Starter&#xff0c;来简化项目…

[hive] posexplode生成从去年一月一号,到本月的月时间表

生成从去年一月一号&#xff0c;到本月的月时间表 posexplode用法&#xff1a; lateral view 表别名 as 序号列名,数组中的元素的名 1、生成序列 SELECT time_stamp_fist_day_of_last_year,--去年第一天的时间戳numfrom(SELECTsplit(repeat_o,,) o_array,time_stamp_fist_da…