Educational Codeforces Round 160 (Div. 2) A~E

A.Rating Increase(思维)

题意:

给出一个仅包含数字的字符串 s s s,要求将该字符串按以下要求分成左右两部分 a , b a,b a,b

  • 两个数字均不包含前导 0 0 0

  • 两个数字均大于 0 0 0

  • b > a b > a b>a

如果有多个答案,输出任意一个均可。

分析:

既然题目要求 b > a b > a b>a,且不能包含前导 0 0 0,那么,将字符串中第一个数字以及之后的连续的 0 0 0分配给 a a a,剩余部分属于 b b b,然后判断 b b b是否大于 a a a即可。

注:使用字符串比较时要注意不能直接使用 > > >进行比较,否则比较的是两个字符串的字典序,而不是数字大小。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 5e2;vector<int> V[30];void solve() {string s;cin >> s;string a = "", b = "";int i, len = s.size();for (i = 0; i < len; i++) {if (i != 0 && s[i] != '0') break;a.push_back(s[i]);}for (; i < len; i++) {b.push_back(s[i]);}if (b.size() > a.size() || (b.size() == a.size() &&  a < b)) {cout << a << ' ' << b << endl;} else {cout << "-1" << endl;}
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

B.Swap and Delete(思维)

题意:

给出仅包含 01 01 01的字符串 s s s,在若干次操作该字符串变为字符串 t t t:

  1. 花费一个金币,并删除字符串中一个字符

  2. 免费操作,任意交换字符串中的字符

问,最少花费多少金币,能够使得最后的得到的字符串 t t t与原字符串 s s s中等长的前缀字符串相同下标的元素全部不同。

分析:

既然操作2不需要花费金币,那么肯定要尽可能的使用操作二。

因此,先记录字符串 s s s 1 1 1 0 0 0的数量,然后从前往后判断,如果当前 s i = 1 s_i = 1 si=1,那么就把后面的 0 0 0交换过来,并将记录的 0 0 0数量减一,如果交换前发现此时后面已经没有 0 0 0了,那么无论怎么交换,均无法使得这个位置上的元素与原字符串 s s s不同,因此所有后面的字符均需使用操作 1 1 1删除,共消耗 n − i n - i ni个金币。

s i = 0 s_i = 0 si=0的情况同理。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 5e2;void solve() {string s;cin >> s;int n = s.size();int one = 0, zero = 0;int ans = n;for (int i = 0; i < n; i++) {if (s[i] == '0') {zero++;} else {one++;}}for (int i = 0; i < n; i++) {if (s[i] == '1') {if (zero == 0) {cout << n - i << endl;return;}zero--;} else {if (one == 0) {cout << n - i << endl;return;}one--;}}cout << 0 << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

C.Game with Multiset(数学)

题意:

给出一个允许装下重复元素的集合,并有以下两种操作:

  1. ADD x:将 2 x 2^{x} 2x放入集合

  2. GET w:询问能否取出集合中的若干元素,满足这些元素的总和为 w w w

分析:

对于操作 1 1 1,使用数组 c n t [ i ] cnt[i] cnt[i]表示存放的 2 i 2^{i} 2i的元素数量。

对于操作 2 2 2,从大到小遍历集合中的元素,通过运算得到当前剩余数字还能减去多少 2 i 2^{i} 2i,并尽可能多的减去 2 i 2^{i} 2i。如果遍历结束后剩余数字为 0 0 0表示可以组成,不为 0 0 0表示不能组成。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 5e2;int mul_set[35];void add(int x) {mul_set[x]++;
}void get(int x) {for (int i = 29; i >= 0; i--) {int cnt = x / (1 << i);//计算最多能减去多少个x -= min(cnt, mul_set[i]) * (1 << i);//注意减去的数量不能比集合中存的数量多}if (x == 0) cout << "Yes" << endl;else cout << "No" << endl;
}int main() {int Case;cin >> Case;while (Case--) {int op, x;cin >> op >> x;if (op == 1) add(x);else get(x);}return 0;
}

D.Array Collapse(DP,前缀和)

题意:

给出一个序列,你可以对序列进行若干次以下操作:

  • 选择一段连续的子段,删除除了子段中最小元素外的所有元素

问:进行若干次操作后(可以不进行操作),能剩下多少种不同的序列?

分析:

考虑DP。

由于每次操作剩下的只有子段中最小的数字,那么可以将情况分为以下两种:

  • 一:当前数字 p [ j ] p[j] p[j] p [ 1 ] ∼ p [ j ] p[1] \sim p[j] p[1]p[j]中最小的,那么有两种方案:

      1. 只操作前面部分,将 p [ j ] p[j] p[j]拼在前面所有方案后面
      1. 使用 p [ j ] p[j] p[j]将前面所有数字消除,此时只剩下一种方案
  • 二:当前数字 p [ j ] p[j] p[j]不是 p [ 1 ] ∼ p [ j ] p[1] \sim p[j] p[1]p[j]中最小的,那么从右往左找到第一个小于 p [ j ] p[j] p[j]的元素 p [ i ] p[i] p[i],若想在最后的序列中保留 p [ j ] p[j] p[j],那么能操作的区域只有 [ i + 1 , j ] [i + 1, j] [i+1,j],此时的方案相当于在情况一的操作,但区域从 [ 1 , j ] [1, j] [1,j]变为 [ i + 1 , j ] [i + 1, j] [i+1,j]

使用前缀和以及单调栈优化操作,即可在规定时间内完成本题。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
const int N = 3e5 + 5e2;
const int MOD = 998244353;int n, a[N], dp[N], pre[N];
stack<int> st;void solve() {while (!st.empty()) st.pop();cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];dp[i] = pre[i] = 0;}int sum = 0;for (int i = 1; i <= n; i++) {while (!st.empty() && a[st.top()] > a[i]) {//维护一个递减的单调栈sum = (sum - dp[st.top()]+MOD) % MOD;st.pop();}if (st.empty()) {dp[i] = (pre[i - 1] + 1) % MOD;}else {dp[i] = ((pre[i - 1] - pre[st.top()] + MOD) % MOD + sum) % MOD;}st.push(i);pre[i] = (pre[i - 1] + dp[i]) % MOD;sum = (sum + dp[i]) % MOD;}cout << (sum + MOD) % MOD << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

E.One-X(网络流)

题意:

给一个 n n n m m m列的矩阵 a a a,矩阵的每个元素为 0 0 0 1 1 1

可以执行以下操作任意次数(可能为零次):选择矩阵中的一个元素并用 0 0 0 1 1 1替换它。

给出两个数组 A A A B B B(长度分别为 n n n m m m)。执行上述操作后,矩阵应满足以下条件:

对于每个 i ∈ [ 1 , n ] i∈[1,n] i[1,n],矩阵第 i i i 1 1 1的个数恰好为 A i A_i Ai
对于每个 j ∈ [ 1 , m ] j∈[1,m] j[1,m],矩阵第 j j j 1 1 1的个数恰好为 B j B_j Bj

计算满足条件的最少操作数。

分析:

本题为网络流中的最小费用最大流,设置一个源点,源点到达每一行的路径容量为 A i A_i Ai,费用为 0 0 0,相同的,源点到达每一列的路径容量为 B i B_i Bi,费用为 0 0 0

用边代表矩阵中的元素,一条边的流量为 1 1 1,若一个边是 0 0 0(即这个元素是 0 0 0),想要通过这个边流过去(即将这个元素变为 1 1 1),需要 1 1 1的费用,若不流过去,需要 0 0 0的费用。若一个边是 1 1 1(即这个元素是 1 1 1),想要通过这个边流过去,需要 0 0 0的费用,若不流过去(将其变为 0 0 0),需要 1 1 1的费用。本题为便于处理,实现网络流,将边是 1 1 1的情况下,想要通过这个边需要的费用设置为 − 1 -1 1,若不流过去需要的费用设置为 0 0 0

注意需要特判总流量,即 ∑ A i \sum\limits A_i Ai ∑ B i \sum\limits B_i Bi,若 ∑ A i ≠ ∑ B i \sum\limits A_i \neq \sum\limits B_i Ai=Bi,则不可能实现,输出 − 1 -1 1

代码:

#include<bits/stdc++.h>using namespace std;
const int MOD = 998244353;
const int MAXN = 1e5 + 5;
const int INF_MAX = 0x3f3f3f3f;
typedef long long LL;struct edge {int v, w, c, ne;
} e[MAXN];int cnt = 1;
int las[MAXN], cur[MAXN];
int dis[MAXN];
bool inq[MAXN], vis[MAXN];
int n, m, s, t, suma, sumb, sum;
int p, q, a[55][55], ls[55], rs[55];
queue<int> q1;void add(int u, int v, int w, int c) {++cnt;e[cnt].v = v;e[cnt].w = w;e[cnt].c = c;e[cnt].ne = las[u];las[u] = cnt;return;
}void Add(int u, int v, int w, int c) {add(u, v, w, c);add(v, u, 0, -c);
}bool SPFA() {for (int i = 1; i <= n; i++) {dis[i] = INF_MAX;inq[i] = 0;}dis[s] = 0;q1.push(s);while (!q1.empty()) {int u = q1.front();q1.pop();inq[u] = 0;for (int i = las[u]; i; i = e[i].ne) {int v = e[i].v;int val = e[i].w;int cost = e[i].c;if (val && dis[v] > dis[u] + cost) {dis[v] = dis[u] + cost;if (!inq[v]) {inq[v] = true;q1.push(v);}}}}return dis[t] < 1e8;
}int dfs(int u, int flow) {vis[u] = true;if (u == t)return flow;int rmn = flow;for (int i = cur[u]; rmn && i; i = e[i].ne) {cur[u] = i;int v = e[i].v;int val = e[i].w;int cost = e[i].c;if (val && dis[v] == dis[u] + cost && !vis[v]) {int fl = dfs(v, min(val, rmn));rmn -= fl;e[i].w -= fl;e[i ^ 1].w += fl;}}vis[u] = false;return flow - rmn;
}LL min_cost() {LL ans = 0;LL res = 0;while (SPFA()) {for (int i = 1; i <= n; i++) {cur[i] = las[i];vis[i] = 0;}LL flow = dfs(s, 1e9);ans += flow;res += flow * dis[t];}if (ans != suma) {cout << "-1" << endl;exit(0);}return res;
}int main() {cin >> p >> q;s = ++n;t = ++n;for (int i = 1; i <= p; i++) {for (int j = 1; j <= q; j++) {cin >> a[i][j];sum += a[i][j];}}for (int i = 1; i <= p; i++) {int x;cin >> x;ls[i] = ++n;Add(s, ls[i], x, 0);suma += x;}for (int i = 1; i <= q; i++) {int x;cin >> x;rs[i] = ++n;Add(rs[i], t, x, 0);sumb += x;}if (suma != sumb) {cout << "-1" << endl;return 0;}for (int i = 1; i <= p; i++) {for (int j = 1; j <= q; j++) {if (a[i][j])Add(ls[i], rs[j], 1, -1);elseAdd(ls[i], rs[j], 1, 1);}}cout << sum + min_cost() << endl;return 0;
}

学习交流

以下为学习交流QQ群,群号: 546235402,每周题解完成后都会转发到群中,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

董宇辉“回归”成为东方甄选高级合伙人,尘埃落地后是谁赢了?

董宇辉“回归”成为东方甄选高级合伙人&#xff0c;尘埃落地后是谁赢了&#xff1f; 董宇辉的“小作文事件”“CEO摔手机事件”迎来大结局了&#xff01; 就在12月18日&#xff0c;董宇辉被任命为新东方教育科技集团董事长文化助理&#xff0c;兼任新东方文旅集团副总裁。有朋…

java中常用的加密算法总结

目前在工作中常用到加密的一些场景&#xff0c;比如密码加密&#xff0c;数据加密&#xff0c;接口参数加密等&#xff0c;故通过本文总结以下常见的加密算法。 1. 对称加密算法 对称加密算法使用相同的密钥进行加密和解密。在Java中&#xff0c;常见的对称加密算法包括&…

网络基础介绍

1.网线制作 1.1 网线制作需要的工具 网线 网线钳 水晶头 测试仪 ​编辑 1.2 网线的标准 1.3 网线的做法 2.集线器&交换机&路由器的介绍 3.OSI七层模型 4.路由器的设置 4.1 常见的路由器设置地址 4.2 常见的路由器账号密码 4.3 登录路由器 设置访客网…

【Axure RP9】中继器应用及相关案例

一 中继器简介 1.1 中继器是什么 中继器&#xff08;Repeater&#xff09;是一种高级的组件&#xff08;Widget&#xff09;&#xff0c;用于显示文本、图像和其他元素的重复集合。它是一个容器&#xff0c;容器中的每一个项目称作“item”&#xff0c;由于“item”中的数据由…

【Spark精讲】Spark五种JOIN策略

目录 三种通用JOIN策略原理 Hash Join 散列连接 原理详解 Sort Merge Join 排序合并连接 Nested Loop 嵌套循环连接 影响JOIN操作的因素 数据集的大小 JOIN的条件 JOIN的类型 Spark中JOIN执行的5种策略 Shuffle Hash Join Broadcast Hash Join Sort Merge Join C…

【面试】Java最新面试题资深开发-微服务篇(1)

问题九&#xff1a;微服务 什么是微服务架构&#xff1f;它与单体架构相比有哪些优势和劣势&#xff1f;解释一下服务发现和服务注册是什么&#xff0c;它们在微服务中的作用是什么&#xff1f;什么是API网关&#xff08;API Gateway&#xff09;&#xff1f;在微服务中它有何…

issue阶段的选择电路的实现

1-of-M的仲裁电路 为什么要实现oldest-first 功能的仲裁呢&#xff1f; 这是考虑到越是旧的指令&#xff0c;和它存在相关性的指令也就越多&#xff0c;因此优先执行最旧的指令&#xff0c;则可以唤醒更多的指令&#xff0c;能够有效地提高处理器执行指令的并行度,而且最旧的指…

德人合科技 | 公司电脑文件加密系统

公司电脑文件加密系统是一种可以对电脑文件进行加密的保护机制。它使用驱动层透明加密技术&#xff0c;能够在用户无感知的情况下对文件进行加密&#xff0c;从源头上保障数据安全和使用安全。 PC端访问地址&#xff1a; www.drhchina.com 此类系统主要有以下几个特点和功能&a…

免 费 搭 建 小程序商城,打造多商家入驻的b2b2c、o2o、直播带货商城

在数字化时代&#xff0c;电商行业正经历着前所未有的变革。鸿鹄云商的saas云平台以其独特的架构和先进的理念&#xff0c;为电商行业带来了全新的商业模式和营销策略。该平台涉及多个平台端&#xff0c;包括平台管理、商家端、买家平台、微服务平台等&#xff0c;涵盖了pc端、…

基于RocketMQ实现分布式事务

前言 在上一篇文章Spring Boot自动装配原理以及实践我们完成了服务通用日志监控组件的开发&#xff0c;确保每个服务都可以基于一个注解实现业务功能的监控。 而本文我们尝试基于RocketMQ实现下单的分布式的事务。可能会有读者会有疑问&#xff0c;之前我们不是基于Seata完成了…

【K8S基础】-k8s的核心概念pod

一、Pod 是什么 1.1 Pod 的定义和概念 在Kubernetes中&#xff0c;Pod是创建或部署的最小/最简单的基本单位。一个Pod代表着集群上正在运行的一个进程&#xff0c;它封装了一个或多个应用容器&#xff0c;并且提供了一些共享资源&#xff0c;如网络和存储&#xff0c;每个Pod…

nbcio-boot的flowable流程模型查询修正为按发布时间倒序

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 之前…

部署智能合约以及 javascript 调用合约函数(Web3项目二实战之三)

在上一篇 智能合约是Web3项目的核心要务(Web3项目二实战之二) ,我们已然为项目编写了智能合约,在攥写完智能合约后,该项目将完成了一大部分,剩下无非就是用户界面交互的内容。 然而,在码完了智能合约代码后,起着承前启后关键性的便是,前端界面与智能合约的交互。 智能…

机器学习---聚类(原型聚类、密度聚类、层次聚类)

1. 原型聚类 原型聚类也称为“基于原型的聚类” (prototype-based clustering)&#xff0c;此类算法假设聚类结构能通过一 组原型刻画。算法过程&#xff1a;通常情况下&#xff0c;算法先对原型进行初始化&#xff0c;再对原型进行迭代更新求解。著 名的原型聚类算法&#…

服务器数据恢复-EMC存储raid5磁盘物理故障离线的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台emc某型号存储服务器&#xff0c;存储服务器上组建了一组raid5磁盘阵列&#xff0c;阵列中有两块磁盘作为热备盘使用。存储服务器在运行过程中有两块磁盘出现故障离线&#xff0c;但是只有一块热备盘激活&#xff0c;最终导致该ra…

安卓小练习-校园闲置交易APP(SQLite+SimpleCursorAdapter适配器)

环境&#xff1a; SDK&#xff1a;34 JDK&#xff1a;20.0.2 编写工具&#xff1a;Android Studio 2022.3.1 整体效果&#xff08;视频演示&#xff09;&#xff1a; 小练习-闲置社区APP演示视频-CSDN直播 部分效果截图&#xff1a; 整体工作流程&#xff1a; 1.用户登录&…

【计算机网络】TCP协议——2.连接管理(三次握手,四次挥手)

目录 前言 一. 建立连接——三次握手 1. 三次握手过程描述 2. TCP连接建立相关问题 二. 释放连接——四次挥手 1. 四次挥手过程描述 2. TCP连接释放相关问题 三. TCP状态转换 结束语 前言 TCP——传输控制协议(Transmission Control Protocol)。是一种面向连接的传…

web前端游戏项目-雷霆战机飞机大战游戏【附源码】

文章目录 一&#xff1a;雷霆战机HTML源码&#xff1a;JS文件&#xff1a;&#xff08;1&#xff09;function.js&#xff08;2&#xff09;impact.js&#xff08;3&#xff09;move.1.1.js&#xff08;4&#xff09;script.js 二&#xff1a;飞机大战HTML源码&#xff1a;CSS源…

MySQL——表的增删查改

目录 一.Create&#xff08;创建&#xff09; 1.单行数据 全列插入 2.多行数据 指定列插入 3.插入否则更新 4. 替换 二.Retrieve&#xff08;读取&#xff09; 1. select 列 查询 2.where 条件 3.结果排序 4.筛选分页结果 三.Update &#xff08;修改&#xff09;…

【改进YOLOv8】磁瓦缺陷分类系统:改进LSKNet骨干网络的YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 近年来&#xff0c;随着智能制造产业的不断发展&#xff0c;基于人工智能与机器视觉的自动化产品缺陷检测技术在各行各业中得到了广泛应用。磁瓦作为永磁电机的主…