蓝书(算法竞赛进阶指南)刷题记录——POJ2442 Sequence(贪心+堆)

poj部分源码--Java poj平台有关数据结构题的Java源码 1159 1276 2406 2502 2509 2513 2533 2778 3176 立即下载

题目:POJ2442.
题目大意:给定 m m m个长度为 n n n的序列,要求在每一个序列中取出一个数并求和,总共会得到 n m n^m nm个和,现在要求这之中最小的 n n n个.
1 ≤ n ≤ 2 ∗ 1 0 3 , 1 ≤ m ≤ 100 1\leq n\leq 2*10^3,1\leq m\leq 100 1≤n≤2∗103,1≤m≤100.

首先先考虑 m = 2 m=2 m=2怎么做.

对于两个序列,我们把这两个序列分别从小到大排序.设排序后两个序列为 a , b a,b a,b,贪心地想到若 k k k小和为 a [ i ] + b [ j ] a[i]+b[j] a[i]+b[j], k + 1 k+1 k+1小和的候选答案中就加入了 a [ i + 1 ] + b [ j ] a[i+1]+b[j] a[i+1]+b[j]和 a [ i ] + b [ j + 1 ] a[i]+b[j+1] a[i]+b[j+1].

有了这个性质后,我们用一个小根堆来维护一个二元组 ( i , j ) (i,j) (i,j)表示一个候选答案为 a [ i ] + b [ j ] a[i]+b[j] a[i]+b[j],然后每次把堆顶取出后加入 ( i + 1 , j ) (i+1,j) (i+1,j)和 ( i , j + 1 ) (i,j+1) (i,j+1)两个候选答案.容易发现取出前 n n n小的候选答案集合大小不会超过 O ( n ) O(n) O(n),因此复杂度是 O ( n log ⁡ n ) O(n\log n) O(nlogn)的.

值得注意的是, ( i , j ) (i,j) (i,j)可以通过 ( i − 1 , j ) (i-1,j) (i−1,j)和 ( i , j − 1 ) (i,j-1) (i,j−1)两个答案加入候选集合.为了避免重复,我们钦定对于每一个候选答案 ( i , j ) (i,j) (i,j),若 j j j指针发生了移动则 i i i指针不会再发生移动,这样就可以保证不会重复了.

具体实现的时候我们可以维护一个四元组 ( x , i , j , t a g ) (x,i,j,tag) (x,i,j,tag),其中 x = a [ i ] + b [ j ] x=a[i]+b[j] x=a[i]+b[j]表示一个候选答案, t a g = 0 / 1 tag=0/1 tag=0/1表示 j j j指针移动 / / /没有移动过.

而对于 m > 2 m>2 m>2的情况,我们可以直接把前两个序列得到的 n n n小值作为一个序列,继续与第 3 3 3个序列计算 n n n小值并以此类推…时间复杂度 O ( m n log ⁡ n ) O(mn\log n) O(mnlogn).

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
  using namespace std;

#define Abigail inline void
typedef long long LL;

const int M=100,N=2000;

struct state{
  int x,i,j,tag;
  state(int X=0,int I=0,int J=0,int Tag=0){x=X;i=I;j=J;tag=Tag;}
  bool operator > (const state &p)const{return x>p.x;} 
};
priority_queue<state,vector<state>,greater<state> >q;
int a[M+9][N+9],n,m,tmp[N+9]; 

Abigail into(){
  scanf("%d%d",&m,&n);
  for (int i=1;i<=m;++i)
    for (int j=1;j<=n;++j)
      scanf("%d",&a[i][j]); 
}

Abigail work(){
  state t;
  sort(a[1]+1,a[1]+1+n);
  for (int k=2;k<=m;++k){
  	int i=1,j=1;
  	sort(a[k]+1,a[k]+1+n);
  	while (!q.empty()) q.pop();
  	q.push(state(a[1][i]+a[k][j],i,j,0));
  	for (int l=1;l<=n;++l){
	  t=q.top();q.pop();
	  tmp[l]=t.x;
	  q.push(state(a[1][t.i]+a[k][t.j+1],t.i,t.j+1,1));
	  if (!t.tag) q.push(state(a[1][t.i+1]+a[k][t.j],t.i+1,t.j,0));
	}
	for (int l=1;l<=n;++l) a[1][l]=tmp[l];
  }
}

Abigail outo(){
  for (int i=1;i<n;++i)
    printf("%d ",a[1][i]);
  printf("%d\n",a[1][n]);
}

int main(){
  int T;
  scanf("%d",&T);
  while (T--){
    into();
    work();
    outo();
  }
  return 0;
}
JAVA中的优先队列与堆(POJ 2442) NULL 博文链接:https://128kj.iteye.com/blog/1730484 立即下载

相关推荐

峰岹FU6832L双核电机控制芯片实战:从FOC算法到BLDC/PMSM驱动开发

在嵌入式系统和电机控制领域,磁场定向控制(FOC)是实现无刷直流电机(BLDC)和永磁同步电机(PMSM)高效、平稳运行的核心算法。其原理是通过坐标变换将三相交流量分解为直流量,实现类似直流电机的转矩与磁场解耦控制,从而提升效率、降低噪音与振动。这项技术的工程价值在于能以更低的处理器开销实现高性能驱动,广泛应用于消费电子、工业自动化与智能家电。本文以峰岹FU6832L芯片为例,深入解析其独特的双核架构——将实时性要求极高的FOC运算交由专用硬件引擎处理,解放主控CPU处理应用逻辑,并结合PID参数整定、电流

weixin_29570795的博客 518

poj2442(优先队列完成贪心思想)

/*此题思想是通过一个优先队列来完成需要不断维护的一个固定长度有序的序列,优先队列大大减少了很多操作*/ #include #include #include using namespace std; int a[3000]; int main() { int t; while(scanf("%d", &t) != EOF){ while(t--){

small__snail__5的博客 549

51单片机也能玩转GC9A01彩屏?超详细移植指南与性能优化技巧

本文详细介绍了如何在51单片机上高效驱动GC9A01彩屏,包括硬件连接优化、SPI模拟驱动、内存管理策略及高级刷新技术。通过分段缓冲、颜色压缩和差异化刷新等技巧,显著提升显示性能,使51单片机也能流畅运行240x240分辨率的彩色TFT屏幕。

hp777的博客 190

POJ2442 Sequence

这个题是两个序列合并的升级版,首先我们要会两个序列合并,然后我们拿合并完的序列和第三个序列合并,得到新的最小值序列,这样一直合并下去,最后得到的就是最值的序列,一个编程的细节就是我们输出答案的数组一开始也是要赋值的,因为输入的序列可能只有一个的情况。知识点:堆,数学归纳法。

m0_73035684的博客 160

Python爬虫实战:5分钟搞定大众点评评论数据抓取(附完整代码)

本文详细介绍了使用Python爬虫高效获取大众点评评论数据的5个关键技巧,包括环境配置、智能页面解析、反反爬策略、数据存储与容错设计以及性能优化。通过实战案例和完整代码,帮助开发者快速掌握文本挖掘技术,适用于市场分析和商业决策。

weixin_30660027的博客 290

关于 Nginx 监听地址 0.0.0.0 的详细解释

0.0.0.0在Nginx配置中表示监听服务器所有网络接口(包括公网IP、内网IP和本地回环地址),这是默认配置。当使用listen 80;时,Nginx会接受通过服务器任何IP地址的80端口访问请求。相比只监听特定IP,这种配置更通用,但也意味着服务会对外网开放,需注意安全风险。可通过netstat命令验证监听状态,显示0.0.0.0:80即表示正确配置。

weixin_43674738的博客 1567

POJ 2442 Sequence(二叉堆)

题目链接: http://poj.org/problem?id=2442 题意: 给你一个m×nm×nm×n的矩阵,让你从mmm行,每行选一个数,得到一个序列,这样共有nnnm^mm种序列,让你求前nnn小的序列和,并输出这n个序列和; 分析: 先写个优先队列的,二叉堆的再说。。。。。 代码: #include<algorithm> #include<iostream> #...

梧桐 264

【异常】Warp终端AI功能403封禁报错I‘m sorry, I couldn‘t complete that request.Request failed with error: ErrorSta

本文针对Warp终端出现的AI功能定向封禁报错,完整还原脱敏后的报错信息、深度解读报错本质,并提供分优先级的全流程可落地解决方案,可直接用于技术排查、内部知识库归档。

奶爸的编程之路,也就一周冷个三天 267

POJ 2442 二叉堆

题意 传送门 POJ 2442 Sequence 题解 若 m=1m=1m=1,使序列升序排序即答案;若 m=2m=2m=2,使序列 A,BA,BA,B 升序排序,若第 kkk 小值为 A[i]+B[j]A[i]+B[j]A[i]+B[j],则第 k+1k+1k+1 小的备选答案中要加入 A[i+1]+B[j],A[i]+B[j+1]A[i+1]+B[j],A[i]+B[j+1]A[i+1]+B[j],A[i]+B[j+1](为防止备选答案重复,应该使其产生路径唯一)使用二叉堆维护备选的第 kkk 小值,求

neweryyy的博客 351

Calibre:LVS 快速debug short/open技巧

用Fix Suggestion和Short Isolate两种方法debug LVS问题

m0_61544122的博客 7462

使用CubeMX配置STM32H7的FreeRTOS

本文将介绍如何使用CubeMX配置STM32H7的FreeRTOS,并提供相应的源代码示例。通过使用CubeMX,你可以轻松地配置FreeRTOS和系统资源,并生成相应的初始化代码和配置文件。在"FreeRTOS"选项卡的"Tasks"部分,可以配置系统中的任务。首先,打开CubeMX软件。在"FreeRTOS"选项卡的"Resources"部分,你可以配置FreeRTOS使用的资源,例如,堆内存和信号量。例如,我们可以创建两个简单的任务,一个任务将在循环中切换LED的状态,另一个任务将通过串口打印消息。

JeeVue的博客 712

电子学会 青少年软件编程(202209)(C语言)(树&堆&图)等级考试(七级)试题 T3 Sequence

电子学会 青少年软件编程(202209)(C语言)(树&堆&图)等级考试(七级)试题 T3 Sequence

青少年趣味编程 473

LDO的原理及测试方法

这是LM317芯片的核心,这个电路单元称为Bandgap Reference带隙基准源。属于模拟集成电路中的经典电路结构。常见的基本结构利用VBE的负温度系数,而VT是正温度系数,正负温度系数抵消就的得到稳定的基准参考电压了(三极管的方程VBE=VT*In(lC/IS))。

shiwei0813的博客 1158

POJ2442

题意 给定M个长度为N的序列,要求从每个序列中任取1个数字,可以构成NM个和,求其中最小的N个和。 思路 首先考虑只有两个序列的情况,分别为序列A和序列B,先将序列A和序列B从小到大排序。最小的和一定是A[1]+B[1],第二小的是min(A[1]+B[2],A[2]+B[1]),假设第二小的是A[1]+B[2],那么第三小的就是min(A[2]+B[1],A[2]+B[2],A[1]+B[3])。这里我们可以看出一些规律了,最小的一定是A[1]+B[1],因为对序列进行过从小到达排序的操作,下一次最小的一

weixin_45800628的博客 257

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

选择困难症

题目描述 又到吃饭时间,Polo 面对饭堂里琳(fei)琅(chang)满(keng)目(die)的各种食品,又陷入了痛苦的抉择中:该是吃手(jiao)打肉饼好呢,还是吃豆(cai)角(chong)肉片好呢?嗯……又不是天秤座怎么会酱紫呢? 具体来说,一顿饭由M 个不同的部分组成(荤菜,素菜,汤,甜品,饮料等等),Polo 要在每个部分中选一种作为今天的午饭。俗话说的好,永远没有免费的午餐,每种

Donald_TY的专栏 1404

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

POJ 2442(优先队列 k路归并 堆)

Description Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's clear that we may get n ^ m this kind of ...

weixin_30344131的博客 240

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

poj 2442(堆的stl实现)

Sequence Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 6281   Accepted: 1962 Description Given m sequences, each contains n non-negative integer. Now we may

有礼貌的程序员 891

【POJ】 2442——Sequence【STL—优先队列】

题意;m * n 的矩阵 m行n列,每一行取一个数加起来,形成一个排列,升序输出排列和最小的前n个。 解题思路:维护两个数组,和一个优先队列,两个数组滚动使用。先对输入进来的每一行进行排序(升序)。把相邻的两行的值的和压入队列,在这个过程中队列中只保留n个元素,即比较小的n个, 多出n个就, 弹出最大的。 具体步骤如下: 1,读入第一行a[i],把第一行进行排序,再读入第二行b[i],用第一

MingShen 581

机试练习07:poj2442——最大堆

一、题解方法 主要是利用stl库中的make_heap,堆排序。 声明三个数组: sum[MAX]: 存放读取到当前序列前的最小和 data[MAX]: 存放当前序列的n个值 Q[MAX]: 计算比较的临时序列,最后会赋值给sum数组。 运算步骤: 读取当前序列中的n个值,分别和sum数组中的第一项加和,存入Q数组,利用make_heap建堆。 接着将这n个值和s...

anbing9968的博客 185

poj 2442 Sequence

题目链接http://poj.org/problem?id=2442 stl实在是tql 借助两个数组的想法,如果当前最小值是a[1] + b[1],那么下一个最小值就会是a[2] + a[1],a[1] + a[2]中的 用堆维护一下就好 耶耶耶 #include <iostream> #include <algorithm> #include <q...

WINDZLY的博客 210

poj 2442(队列,模拟)

F - SequenceTime Limit: 6000 MS Memory Limit: 65536 KB64-bit integer IO format: %I64d , %I64u Java class name: Main[Submit] [Status]DescriptionGiven m sequences, each contains n non-negative integer. ...

1999 252

POJ 2442-Sequence(优先队列-m组n个数每组取一个求n个最小值)

Sequence Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 9285   Accepted: 3097 Description Given m sequences, each contains n non-negative integer. Now we

Some. 1950

POJ 2442 Sequence (优先队列|堆)

题意:n组序列,每组有m个数,从每组数中各选1个,则共有m^n种和,输出最小的前m个和。 题解:优先队列|堆 代码写的太乱了,别看。 用优先队列维护大小为m的最大堆。 先将第一行序列放进队列,同时用数组a[]存优先队列中的m个元素,并升序排序(更快)。队列清空。 接着考虑下一组,对于该组每一个元素x,将a[0]+x放入队列,然后遍历所有组合a[i]+x,维护大小为m的最大堆。 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include&

gongyuandaye的博客 286

POJ2442 优先队列

优先队列不同于普通队列,它分为最大优先队列和最小优先队列,当你写成priority_queue<int >a时,它默认为最大优先队列 最大优先队列即,当它用 a.top()时 从队列中寻找最大的数值,当它用 a.pop()时 从队列中删除最大的数值, #include <cstdio>#include <cstring>#include <...

weixin_30604651的博客 155

POJ2442:Sequence

浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:http://poj.org/problem?id=2442 我们先简化题意,假设只有两行。 那么显然,最小值是\(a_1+b_1\)。并且次小值集合是\(a_2+b_1,a_1+b_2\)。 假设\(a_1+b_2\)是次小值,那么次次小值集合就是\(a_2+b_1,a_2+...

aga28832的博客 184
上一篇: 蓝书(算法竞赛进阶指南)刷题记录——CH#46A & BZOJ3276 磁力块(bfs+分块)
下一篇: 蓝书(算法竞赛进阶指南)刷题记录——BZOJ3674可持久化并查集加强版题解(启发式合并+并查集+主席树)
hezlik
博客等级 码龄9年 111粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值