Codeforces Round 922 (Div. 2)补题

Brick Wall(Problem - A - Codeforces)

题目大意:规定砖的大小为1*k(k>=2),现在有一面n*m的砖墙,n是墙高,m是墙宽,砖在砖墙中有两种放法,水平放置和竖直放置,墙的稳定性=水平放置的砖的数量-竖直放置的砖的数量。现在要求墙的稳定性的最大值。注意墙不用填满,砖不能相交。

思路:很显然我们尽可能地水平放置,不竖直放置即可。反正又不用填满。

#include<bits/stdc++.h>
using namespace std;
int main()
{int t;scanf("%d",&t);while(t--){int n,m;scanf("%d%d",&n,&m);m /= 2;n*=m;printf("%d\n",n);}
}

Minimize Inversions(Problem - B - Codeforces)

题目大意:现在有两个排列a,b,我们需要选择两个位置i,j,交换ai,aj和bi,bj,最后要使两个序列中的反转数最小。

思路:刚开始我看到这个题也没有什么头绪,然后就去分析了下样例,前两个样例没什么感觉,看到第三个样例的时候,我突然发现第三个样例的输出中第二个排列有序的。呀,昨晚上太着急了,以为它们是有序的,刚刚一看竟然不是,但是最后的结果确实是使一个排序变成有序的。不过我们还是来证明一下比较放心。

我们很容易通过交换使一个排列变成有序的,这样的话,两个排列中的反转数会是最小的吗?显然在有序的那个排列中反转数为0,那么在另一个序列中呢?哎,这个有点证不明白,但是写题解还是不要水,我去看了下官方的证明,思路大概是这样:

对于a,b我们选出来的i,j构成的逆序对数量为0,1,2,如果其中一个排列有序,那么另一个最多是1,这样对于这一对来说就是最优解,让某个序列全部排序,那么每一对都是最优的情况,那么就是最小的时候。

#include<bits/stdc++.h>
using namespace std;
int a[200010],b[200010];
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);vector<pair<int,int>>p;for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) scanf("%d",&b[i]);for(int i=1;i<=n;i++) p.push_back({a[i],b[i]});sort(p.begin(),p.end());for(int i=0;i<n;i++){int x=p[i].first,y=p[i].second;printf("%d ",x);}printf("\n");for(int i=0;i<n;i++){int x=p[i].first,y=p[i].second;printf("%d ",y);}printf("\n");}
}

XOR-distance(Problem - C - Codeforces)

题目大意:现有三个数a,b,r,我们需要在[0,r]中选一个数x,使得|(a^x)-(b^x)|最小,输出最小值。

思路:既然涉及到位运算,那么我们就从二进制的角度来看:

显然如果a,b在二进制的某一位相同,那么和x进行异或之后,还是相同的,所以没什么变化,那么我们要想最小化结果,肯定还是要从不同位入手,很明显如果一个为0,一个为1,那么如果是0作为被减数,那么就要从高位退1下来参与,所以我们肯定将最高位1在的那个数中二进制下为1,而另一个数二进制下为0的位置更改一下,另外第一个相异的位置不能改动,因为要从这里退位下来。那么问题就解决了。那么我们直接进行位运算即可,注意不要超过r。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{int t;scanf("%lld",&t);while(t--){int a,b,r;scanf("%lld%lld%lld",&a,&b,&r);if(a<b) swap(a,b);int flag=1;for(int i=60;i>=0;i--){int ta=(a>>i)&1,tb=(b>>i)&1;if(flag&&ta!=tb) {flag=0;continue;}if(!flag){if(ta==1&&tb==0) {if((1ll<<i)<=r) {r -= (1ll<<i);a ^= (1ll<<i);b ^= (1ll<<i);}}}}cout<<abs(a-b)<<endl;}
}

 Blocking Elements(Problem - D - Codeforces)

题目大意:现在有一个数组a[]和一个数组b[],我们要在a[]中将a[b[i]]的位置挑出来相加,剩下的以被挑走的位置为分隔,划出若干个区间,每个区间内部求和,这些和中的最大值作为结果,输出最小结果。举个例子:

思路:这里的结果肯定是在[1,sum]之内,所以想到二分,要快速求若干区间的和,那么想到预处理前缀和。现在最关键的问题就是二分的check函数怎么写。

我最初想的是就从头开始,一旦超过mid之后就以此划分,最后看挑出来的数是否小于mid,但是显然这个思路不可以。这么来看,我们第一次划分前的所有位置实际都可以作为第一次划分的位置,当然第二,第三次划分也是同理,那么就跟dfs联系起来了,对于搜每一次划分的位置。但是,显然时间复杂度太高了,这个题n的范围还有点大,那么就得换个思路。dfs简化就很容易想到动态规划,那么我们该如何动态规划呢?其实这里已经分析出了一个很重要的条件,每次划分的合法位置是一个区间,那么我们要想使结果最优,肯定是从这个区间中挑比较小的数加进结果。那么可以定义dp[i]表示以i位置为区间结尾,此时被挑选的数的和。因为我们在挑选的时候已经确定了每个区间的和是小于m的,进而来找划分位置,所以只要从这些合法的中找一个最小的即可。从一个区间中找最值,很容易想到滑动窗口,这里又是dp,那么就是单调队列优化dp的类型。还有一个问题,找合法区间的左端点时,是否必须从头开始找,显然不是,因为很容易可以发现,如果当前的i的左端点在j位置,那么后一个i的左端点一定是在j位置后面,因为我们确定区间只是通过区间和小于m来确定的。每一个值都是正数,那么区间和,区间一定不会再变长。所以我们只用看队列的开头是否需要弹出,来找合适的位置,因为队列是单增的,所以开头一定最小。

另外,结尾可能在任意位置,所以我们要循环判断一下。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int q[100010],a[100010],s[100010],dp[100010],hh,tt,n;
int check(int m)
{hh=0,tt=1;//数组模拟队列q[0]=0;for(int i=1;i<=n;i++){while(hh<tt&&s[i-1]-s[q[hh]]>m) hh++;dp[i]=dp[q[hh]]+a[i];while(hh<tt&&dp[q[tt-1]]>=dp[i]) tt--;q[tt++]=i;}for(int i=1;i<=n;i++)if(dp[i]<=m&&s[n]-s[i]<=m) return 1;return 0;
}
signed main()
{int t;scanf("%lld",&t);while(t--){scanf("%lld",&n);for(int i=1;i<=n;i++) scanf("%lld",&a[i]),s[i]=s[i-1]+a[i];int l=1,r=s[n];while(l<r){int mid=(l+r)/2;if(check(mid)) r=mid;else l=mid+1;}printf("%lld\n",l);}
}

核心:虽然这道题既有区间和又有选点,但本质上考的是在限制区间的情况下求最小值,限制区间的条件比较隐蔽而已。 因为每一个划分的合法位置实际在一个区间中找,那么显然要找最小值,那么就是区间找最小值的问题,然后有多个位置,所以联系到单调队列优化的dp问题。

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

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

相关文章

注册亚马逊店铺用动态IP可以吗?

注册亚马逊店铺可以用动态IP&#xff0c;只要是独立且干净的网线就没问题&#xff0c;亚马逊规则要求一个IP地址只能出现一个亚马逊店铺&#xff0c;若使用不当会导致关联账户。 固定ip可以给我们的账户带来更多的安全&#xff0c;要知道关联问题是亚马逊上的一个大问题&#…

《动手学深度学习(PyTorch版)》笔记4.8

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

人工智能基础-Numpy.array基本操作

基本属性 查看维度 x.ndim查看维度&#xff08;元组形式&#xff09; x.shape元素个数 x.size数据访问 子矩阵 内容同步修改 加是copy&#xff08;&#xff09;则不同步修改 Reshape 修改维度 参数为-1时自动识别个数 合并 np.concatenate([x, y])沿着列合并 np.co…

第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)题解

尝试再做一次&#xff0c;我记得还是有点难&#xff0c;我会尽量多写一点解析&#xff0c;尽量让基础比较弱的友友也能看懂&#xff0c;希望能给你带来帮助 目录 1. 日期统计 题目描述 解题思路 具体代码 2. 01 串的熵 题目描述 解题思路 具体代码 3. 冶炼金属 题目…

如何编写具有完备性的测试用例 ? 具体思路是什么 ? 全套解决方案打包呈现给你 。

设计测试用例应该算是测试人员最为主要的工作之一 &#xff0c;好的测试用例往往具有覆盖性强 &#xff0c;扩展性高以及复用性好等特点 。该如何设计出好的测试用例 &#xff1f;是我们每一位测试人员需要重点思考的问题 &#xff0c;下面是我对设计测试用例设计的思考 &#…

#RAG|NLP|Jieba|PDF2WORD# pdf转word-换行问题

文档在生成PDF时,文宁都发生了什么。本文讲解了配置对象、resources对象和content对象的作用,以及字体、宇号、坐标、文本摆放等过程。同时,还解释了为什么PDF转word或转文字都是一行一行的以及为什么页眉页脚的问题会加大识别难度。最后提到了文本的编码和PDF中缺少文档结构标…

如何输入手机验证码才能查询?确保本人查询!

易查分的手机验证码功能可以通过预留手机号&#xff0c;让用户查询时输入验证码&#xff0c;确保是本人进行查询。本次就来介绍如何开启【手机验证码功能】。 &#x1f4cc;使用教程 01准备电子表格 在准备表格时&#xff0c;建立查询时&#xff0c;查询条件必须设置两个或者两…

ElementUI 组件:Container 布局容器实例

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 项目里el-container-example.vue代码 <script> export default {name: el_container_example,data() {const item {date: 2024-01-31,name: 国龙,address: 上海市某区…

Mac 终端可以使用yarn,但是vscode里面报错segmentation fault

Mac 终端可以使用yarn 但是vscode里面报错segmentation fault 查阅官网https://www.yarnpkg.cn/getting-started/install 在vscode运行corepack enable即可解决该问题

网络异常案例五_SYN被丢弃

问题现象 公司同事使用的时候&#xff0c;反馈系统不稳定&#xff0c;访问的时候&#xff0c;有时候会出现白屏&#xff08;连接超时&#xff09;&#xff0c;或者系统页面点击没有响应&#xff0c;过一会之后刷新系统又可以正常展示了。之前未收到过类似反馈&#xff0c;一直…

20240131在WIN10下配置whisper

20240131在WIN10下配置whisper 2024/1/31 18:25 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】800&#xffe5; 2、请正确安装好NVIDIA最新的545版本的驱动程序和CUDA。 2、安装Torch 3、配置whisper http…

2024年数学建模美赛 分析与编程

2024年数学建模美赛 分析与编程 1、本专栏将在2024年美赛题目公布后&#xff0c;进行深入分析&#xff0c;建议收藏&#xff1b; 2、本专栏对2023年赛题&#xff0c;其它题目分析详见专题讨论&#xff1b; 2023年数学建模美赛A题&#xff08;A drought stricken plant communi…

k8s Sidecar filebeat 收集容器中的trace日志和app日志

目录 一、背景 二、设计 三、具体实现 Filebeat配置 K8S SideCar yaml Logstash配置 一、背景 将容器中服务的trace日志和应用日志收集到KAFKA&#xff0c;需要注意的是 trace 日志和app 日志需要存放在同一个KAFKA两个不同的topic中。分别为APP_TOPIC和TRACE_TOPIC 二、…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程&#xff1a;https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

Java 的 Map 與 List

通過重新new 一個ArrayList 轉化 resTask.setList(new ArrayList<Group>(custMap.values())); 无序的Map List 有序的数据放到Map&#xff0c;就变成无序。 List排序 按照code 的字母进行排序A-Z resTask.getListData().sort(Comparator.comparing(Gmer::getCode));…

Hadoop3.x基础(2)- HDFS

来源&#xff1a;B站尚硅谷 目录 HDFS概述HDFS产出背景及定义HDFS优缺点HDFS组成架构HDFS文件块大小&#xff08;面试重点&#xff09; HDFS的Shell操作&#xff08;开发重点&#xff09;基本语法命令大全常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作HDFS的API案例…

Vue.js 学习14 集成H265web.js播放器实现webpack自动化构建

Vue.js 学习14 集成H265web.js播放器实现webpack自动化构建 一、项目说明1. H265web.js 简介2. 准备环境 二、项目配置1. 下载 H265web.js2. 在vue项目里引入 H265web3. 设置 vue.config.js 三、代码引用1. 参照官方demo &#xff0c; 创建 executor.js2. 在 vue 页面里引用htm…

Wireshark网络协议分析 - Wireshark速览

在我的博客阅读本文 文章目录 1. 版本与平台2. 快速上手2.1. 选择网络接口进行捕获&#xff08;Capture&#xff09;2.2. 以Ping命令为例进行抓包分析2.3. 设置合适的过滤表达式2.4. 数据包详情2.5. TCP/IP 四层模型 3. 参考资料 1. 版本与平台 Wireshark是一个开源的网络数据…

Linux——安装MySQL

1、安装mysql8.0.35 1.1、安装步骤 1.更新包列表&#xff0c;首先&#xff0c;确保您的系统已更新到最新状态。运行以下命令来更新包列表和安装最新的软件包&#xff1a; sudo apt update sudo apt upgrade2.安装MySQL服务器&#xff1a;运行以下命令来安装MySQL服务器&…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏5(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言修改鼠标光标和中心提示图鼠标光标素材修改默认鼠标光标修改中心提示图 拾取提示弹窗简单绘制UI拾取弹窗功能 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使…