多路归并总结

1.鱼塘钓鱼

1262. 鱼塘钓鱼 - AcWing题库

多路归并的模型。

对于每个鱼塘构成的等差数列,我们每次在数列最头部进行选择,选完后再顺延到下一个数即可。我们可以通过维护一个包含所有等差序列首元素的大根堆,使每次可以很容易地选出最大的数。

这里还有一点点贪心,我们要知道,当人到达某个鱼塘时,一次性钓完需要钓的所有鱼,这种情况一定比折返钓鱼的情况更优。

我们枚举人最远走到哪个鱼塘,则钓鱼的总时间是t-路上的时间,在固定的时间和鱼塘范围内来进行多路归并。

#include<iostream>
#include<queue>
using namespace std;
const int N=110;
typedef pair<int,int> PII;
#define x first
#define y second
int n,t;
int a[N],b[N],c[N];
int main()
{scanf("%d",&n);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=2;i<=n;i++) {scanf("%d",&c[i]);c[i]+=c[i-1];}scanf("%d",&t);int res=0;for(int i=1;i<=n;i++){int tt=t-c[i];priority_queue<PII> heap;for(int j=1;j<=i;j++){heap.push({a[j],j});}int fish=0;while(heap.size()&&tt>0){int val=heap.top().x;fish+=val;tt--;int p=heap.top().y;heap.pop();heap.push({max(val-b[p],0),p});}res=max(res,fish);}printf("%d",res);
}

2.序列

146. 序列 - AcWing题库

首先思考最暴力的情况,是将n^{m}个值全算出来,sort一遍,然后取前n个最小值。暴力的时间复杂度和空间复杂度显然都超了,我们继续思考优化的方法。

第一步优化,我们可以选择每次合并两个序列,共合并m-1次,每次合并时后将结果排序,只保留前n个最小值,这样的时间复杂度就降到了O(mn^{2}logn^{2})

第二步优化,我们可以将序列分为n组,每组中有n个数,并且保证每组中的n个数是从小到大排序的。我们先将a数组从小到大排列,就可以达到这样的目的,分组方式如下图:

在这n组数中,最前面的数一定是本组中最小的数,因此,每次合并时,我们只需要进行n次选择,每次在这n组数的最前面选择一个数,就可以得到最后的结果。而这个选择过程,可以通过维护一个大小为n的小根堆来实现。在最开始,我们将每组的第一个数存入小根堆中,每次选择时取出堆顶元素,再将同组的下一个元素插入小根堆即可。这样一来,时间复杂度就变为了O(mnlogn)

在这里也顺便复习了一下STL的堆写法。

建堆:

//大根堆
priority_queue<int> heap;
//小根堆
priority_queue<int,vector<int>,greater<int>> heap;

操作:

//插入
heap.push();
//删除堆顶元素
heap.pop();
//查看堆顶元素
heap.top();

ac代码如下:

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
#define x first
#define y second
const int M=1010,N=2010;
int T;
int a[N],b[N];
int n,m;
void merge()
{priority_queue<PII,vector<PII>,greater<PII>> heap;for(int i=1;i<=n;i++) heap.push({a[1]+b[i],1});int c[N];for(int i=1;i<=n;i++){c[i]=heap.top().x;int p=heap.top().y;heap.pop();heap.push({c[i]-a[p]+a[p+1],p+1});}for(int i=1;i<=n;i++) a[i]=c[i];
}
int main()
{scanf("%d",&T);while(T--){int heap[N];scanf("%d%d",&m,&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+1+n);for(int i=1;i<=m-1;i++){for(int j=1;j<=n;j++) scanf("%d",&b[j]);merge();}for(int i=1;i<=n;i++) printf("%d ",a[i]);printf("\n");}
}

也可以自己手写堆来实现:

手写堆的板子可以看这条博客。

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
#define x first
#define y second
const int M=1010,N=2010;
int T;
int a[N],b[N];
int n,m;
void down(int u,PII heap[],int idx)
{int t=u;if(2*u<=idx&&heap[t].x>heap[2*u].x) t=2*u;if(2*u+1<=idx&&heap[t].x>heap[2*u+1].x) t=2*u+1;if(t!=u) {swap(heap[t],heap[u]);down(t,heap,idx);}
}
void up(int u,PII heap[],int idx)
{while(u/2&&heap[u/2].x>heap[u].x) {swap(heap[u/2],heap[u]) ;u/=2;}
}
void merge()
{PII heap[N];int idx=0;for(int i=1;i<=n;i++) {heap[++idx]={a[1]+b[i],1};up(idx,heap,idx);}int c[N];for(int i=1;i<=n;i++){c[i]=heap[1].x;int p=heap[1].y;swap(heap[1],heap[idx--]);down(1,heap,idx);heap[++idx]={c[i]-a[p]+a[p+1],p+1};up(idx,heap,idx);}for(int i=1;i<=n;i++) a[i]=c[i];
}
int main()
{scanf("%d",&T);while(T--){int heap[N];scanf("%d%d",&m,&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+1+n);for(int i=1;i<=m-1;i++){for(int j=1;j<=n;j++) scanf("%d",&b[j]);merge();}for(int i=1;i<=n;i++) printf("%d ",a[i]);printf("\n");}
}

3.技能升级

找不到页面 - AcWing

和鱼塘钓鱼是完全相同的模型,但是数据范围大了很多,需要进一步优化。可以看到,这题中的m很大,我们要尽可能地想办法让时间复杂度不受m的影响或者是logm。

在多路归并后,如果将结果输出为一个序列,我们会发现这个序列一定是单调的(在本题中是单调递增),而且,我们可以找到序列中最小的数,当每一路中的数小于这个数时,这一路的数都不可能再选了。

由此想到二分,我们可以二分一个x,使得>=x的数有>=m个,>=x+1的数有<m个。而且,由于等差数列的性质,我们可以很轻易地求出所有路中>=x的数的个数。

#include<iostream>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int n,m;
int a[N],b[N];
bool check(int u)
{ll res=0;for(int i=1;i<=n;i++){if(a[i]>=u) res+=(a[i]-u)/b[i]+1;}if(res>=m) return true;else return false;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);int l=0,r=1e6;while(l<r){int mid=(l+r+1)>>1;if(check(mid)) l=mid;else r=mid-1;}ll res=0;ll cnt=0;for(int i=1;i<=n;i++){if(a[i]>=l){int xiangshu=(a[i]-l)/b[i]+1;int moxiang=a[i]-(xiangshu-1)*b[i];res+=(ll)(a[i]+moxiang)*xiangshu/2;cnt+=xiangshu;}}printf("%lld",res-(cnt-m)*l);
}

4.丑数

62. 丑数 - AcWing题库

我们先列出一些丑数,寻找它们的规律:

可以发现,总集s是s2、s3和s5的并集。于是,我们只需要对s2、s3和s5进行多路归并+判重。

#include<vector>
class Solution {
public:int getUglyNumber(int n) {vector<int> q;q.push_back(1);int i=0,j=0,k=0;for(int l=2;l<=n;l++){int t=min(q[i]*2,min(q[j]*3,q[k]*5));q.push_back(t);if(q[i]*2==t) i++;if(q[j]*3==t) j++;if(q[k]*5==t) k++;}return q.back();}
};

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

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

相关文章

Vivado使用记录(未完待续)

一、Zynq开发流程 二、软件安装 三、软件使用 字体大小修改&#xff1a;Setting、Font 四、Vivado基本开发流程 1、创建工程 Quick Start 组包含有 Create Project&#xff08;创建工程&#xff09;、 Open Project&#xff08;打开工程&#xff09;、 Open Example Project&…

List之ArrayList、LinkedList深入分析

集合 Java 集合&#xff0c; 也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Collection 接口&#xff0c;下面又有三个主要的子接口&…

洗衣洗鞋店小程序对接水洗唛打印,一键预约,支付无忧

随着社会的进步和科技的发展&#xff0c;我们的生活幸福感与日俱增。为了让我们从琐碎中解脱出来&#xff0c;干洗店洗鞋店行业也日新月异。今天&#xff0c;我为大家推荐这款优秀的干洗店小程序系统&#xff0c;让您的洗衣洗鞋服务体验更上一层楼。 干洗店管理系统是一款专为洗…

阿里云和腾讯云区别价格表,云服务器费用对比2024年最新

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器61元一年&#xff0c;2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

力扣热题100_普通数组_73_矩阵置零

文章目录 题目链接解题思路解题代码 题目链接 73.矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&…

lvs集群介绍

目录 一、LVS集群基本介绍 1、什么是集群 2、集群的类型 2.1 负载均衡群集&#xff08;Load Balance Cluster) 2.2 高可用群集(High Availiablity Cluster) 2.3 高性能运算群集(High Performance Computing Cluster) 3、负载均衡集群的结构 ​编辑 4、LVS集群类型中的…

3D资产管理

3D 资产管理是指组织、跟踪、优化和分发 3D 模型和资产以用于游戏、电影、AR/VR 体验等各种应用的过程。 3D资产管理也称为3D内容管理。 随着游戏、电影、建筑、工程等行业中 3D 内容的增长&#xff0c;实施有效的资产管理工作流程对于提高生产力、减少错误、简化工作流程以及使…

足球俱乐部管理系统:Java与SpringBoot的管理系统实践

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

MySQL存储函数

存储函数是有返回值存储过程&#xff0c;存储函数的参数只能还是IN类型的 1、语法 create function 存储函数名称 &#xff08;[参数列表]&#xff09;Returns type [characterrastic...]Begin--SQL语句Return ..;End;characterrastic说明&#xff1a;Deterministic:相同的输…

uniapp使用openlayers加载地图服务

uniapp使用openlayers加载地图服务 <!-- 地图组件 --> <template><view id"myMap" :regionChangeItem"regionChangeItem" :change:regionChangeItem"olRender.selectAdministrativeRegion":tagSelectProducetagSelectProduce :t…

Visual Studio 2022之Release版本程序发送到其它计算机运行

目录 1、缺少dll​ 2、应用程序无法正常启动 3、This application failed to start because no Qt platform plugin could be initialized. 代码在Debug模式下正常运行&#xff0c;然后切换到Release模式下&#xff0c;也正常运行&#xff0c;把第三方平台的dll拷贝到exe所在…

IPv6扩展头(四)——分片头

分片头部&#xff08;Fragment Header&#xff09;用于IPv6源节点向目的节点发送一个大于路径MTU的数据报。 一、优势 IPv6 分片头具有多种优势&#xff0c;可提高网络效率&#xff0c;包括减少数据包延迟和减少网络拥塞。使用 IPv6 分片头&#xff0c;数据包在源处而不是中间…

Uninty 鼠标点击(摄像机发出射线-检测位置)

平面来触发碰撞&#xff0c;胶囊用红色材质方便观察。 脚本挂载到胶囊上方便操作。 目前实现的功能&#xff0c;鼠标左键点击&#xff0c;胶囊就移动到那个位置上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c6 : MonoBe…

数据结构-线段树

&#x1f4d1;前言 本文主要是【线段树】——线段树简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&…

PyCharm Community Edition 2023.3.3,UI界面设置成旧版

File->Settings->Appearance & Behavior->New UI->Enable new UI(取消勾选)->重启PyCharm 旧版UI: 新版UI&#xff1a;

对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解

目录 1、JVM 的类加载机制 1.1、加载 1.2、验证 1.3、准备 1.4、解析 1.5、初始化 2、双亲委派模型 2.1、工作过程 1、JVM 的类加载机制 类加载指的是 Java 进程运行的时候&#xff0c;需要把 .class 文件从硬盘读取到内存&#xff0c;并进行一系列的校验解析的过程。…

人民日报:用好“人工智能+” 赋能产业升级

以下文章来源&#xff1a;北京日报 文生视频、智能家居、智慧工厂……近年来&#xff0c;人工智能发展速度之快、应用范围之广备受瞩目。 政府工作报告提出&#xff0c;深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;打造具有国际竞争力的数字产…

力扣589、590、102、107、429、199、637、515、116、117、104、111、226、101-Java刷题笔记

一、589. N 叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 1.1题目 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09…

使用Python制作自己的wheel文件

平时自己利用Python制作一个个小工具后想分享给别人&#xff0c;但又嫌分享一堆项目代码很麻烦&#xff0c;那么你可以考虑将自己的项目打包成一个wheel文件&#xff0c;别人拿到文件后只需pip install安装即可使用&#xff0c;非常方便。 在上一篇博文中&#xff0c;利用nvid…

在maven多模块之间调用报错

错误信息为&#xff1a;不能解决maven_02_ssm项目的依赖问题&#xff0c;找不到maven_03_pojo这个jar包。 为什么找不到呢? 原因是Maven会从本地仓库找对应的jar包&#xff0c;但是本地仓库又不存在该jar包所以会报错。 在IDEA中是有maven_03_pojo这个项目&#xff0c;所以…