UVa11997 K Smallest Sums 归并 + 优先队列

想发故障诊断论文?手把手教你用CWRU数据集复现第一个Baseline模型 本文提供了一份基于CWRU轴承数据集的故障诊断Baseline模型实战指南,手把手教你从数据准备到模型构建的全流程。通过详细的Python代码示例和学术级实验设计,帮助初学者快速复现第一个故障诊断模型,为发表高质量论文奠定基础。 阅读详情




朴素算法O(n ^ n)啊,这都能做,想了想,最后只要输出其中和的前k小的就行了,有很多计算是冗余的啊,想了想,每行排个序,然后只算前两列,还有2 ^ k个,取k个绰绰有余了,O(2 ^ n),还能骗点分……扇自己一巴掌,卧槽你以为做PAT呢,还能骗分,然而还是忍不住交了一发……


WA代码:


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <iostream>
#include <set>
#include <queue>
#include <string>
#include <vector>

using namespace std;

struct node {
	int psum;
	node() {}
	node(int psum) : psum(psum) {}
	bool operator < (const node &on) const {
		return this->psum > on.psum;
	}
};

int k, cnt;
int a[755][755];
priority_queue<node> Q;

void dfs(int dep, int sum) {
	if (cnt == 1000000) {
		return;
	}
	if (dep == k) {
		Q.push(node(sum));
		cnt++;
		return;
	}
	dfs(dep + 1, sum + a[dep][0]);
	dfs(dep + 1, sum + a[dep][1]);
}

int main()
{
	while (~scanf("%d", &k)) {
		for (int i = 0; i < k; i++) {
			for (int j = 0; j < k; j++) {
				scanf("%d", &a[i][j]);
			}
			sort(a[i], a[i] + k);
		}
		while (!Q.empty()) Q.pop();
		cnt = 0;
		dfs(0, 0);
		int c = 0;
		while (!Q.empty()) {
			printf(c++ == 0 ? "%d" : " %d", Q.top());
			Q.pop();
			if (c == k) break;
		}
		puts("");
	}
	return 0;
}


没仔细想还有没有别的什么错误,不过这O(2 ^ k)的复杂度肯定是不行的……


其实我只想到了一个起点,没想到归并,一列一列往下合并,横向地去求而不是纵向的,不断地往最小堆里扔,每次取最小的再合并再扔,最后时间复杂度O(n²logn)


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <iostream>
#include <set>
#include <queue>
#include <string>
#include <vector>

using namespace std;

struct node {
	int a, b;
	node() {}
	node(int a, int b) : a(a), b(b) {}
	bool operator < (const node& on) const {
		return this->a > on.a;
	}
};

int A[755][755], C[755];
int n;
priority_queue<node> Q;

void Merge(int *A, int *B, int *C) {
	while (!Q.empty()) Q.pop();
	for (int i = 0; i < n; i++) {
		Q.push(node(A[i] + B[0], 0));
	}
	for (int i = 0; i < n; i++) {
		node tn = Q.top(); Q.pop();
		int a = tn.a, b = tn.b;
		C[i] = a;
		if (b + 1 < n) Q.push(node(a - B[b] + B[b + 1], b + 1));
	}
}

int main()
{
	while (~scanf("%d", &n)) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				scanf("%d", &A[i][j]);
			}
			sort(A[i], A[i] + n);
		}
		memcpy(C, A[0], sizeof(A[0]));
		for (int i = 1; i < n; i++) {
			Merge(C, A[i], C);
		}
		printf("%d", C[0]);
		for (int i = 1; i < n; i++) {
			printf(" %d", C[i]);
		}
		puts("");
	}
	return 0;
}





STM32_DAC DAC(Digital-to-Analog Converter,数模转换器)是将数字信号转换为模拟信号的外设,广泛应用于音频输出、波形生成、电机控制等场景。STM32F407 系列芯片配备了 2 个 DAC 通道(DAC1 和 DAC2),支持 12 位分辨率,支持多种触发方式,可输出稳定的模拟电压。本文从 DAC 的基本原理出发,详细讲解 STM32F407 DAC 的配置方法、代码实现、波形生成以及实际应用案例,帮助你快速掌握 DAC 的使用技巧。 阅读详情

相关推荐

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 318

K Smallest Sums(Uva 11997) 多路归并+优先队列

来自《算法竞赛入门经典训练指南》 1.题目原文 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3148 有k个整数数组,各包含k个整数。在每个数组中去一个元素加起来,可以得到k^k个元素,求这些和中最小的k个值(重复的值算多次) 2.解题思路

相思作坊半世离殇的博客 471

STM32L151C8T6低功耗实战:RTC闹钟唤醒停机模式的配置与优化

本文详细介绍了如何在STM32L151C8T6微控制器上配置与优化RTC闹钟唤醒停机模式,以实现极致的低功耗设计。文章从核心原理出发,结合STM32CubeMX配置实战,深入讲解了进入停机模式前的关键准备工作、唤醒后的系统恢复流程,并分享了将功耗降至个位数微安级的深度优化技巧与常见问题解决方案。

weixin_29166013的博客 298

UVa - 11997 K Smallest Sums(优先队列多路归并)

题意是k个数组,每个数组k个元素,每个数组取一个元素,共k个数之和成为一个参考值,求出k^k个参考值中最小的k个    ... 方法就是先 对每个数组排序,    然后由于k个之和最小和 2个之和最小是一样的,那么每次处理两个数组就可以了。。。。 对数组A,B  求前k小的A[i]+B[i]    方法是不断取尽可能小的放到优先队列,然后直接取前K个就行了 第一次我的取法是

缺氧 604

Neo4j 智能供应链应用源代码简析

本文简析Neo4j智能供应链应用的源代码,让你也可以快速开发自己的供应链应用。

Neo4j 开发者博客 1679

抖音中动态生成msToken的方法

抖音中动态生成msToken的方法

sh_moranliunian的博客 2483

K Smallest Sums UVA - 11997(多路归并+优先队列)

You’re given k arrays, each array has k integers. There are k k ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest sums among the...

weixin_43736492的博客 255

Tableau学习教程(万字保姆级教程)​​​​​​

​Tableau学习教程(保姆级教材,学不会私信留言来找我) 从BI系统开发的角度来学习tableau工具,更学会报表开发的流程 内含学习使用数据源,tableau打包工作簿,可直接提取使用 ​...

小菜菜的博客 6万+

UVA11997K Smallest Sums(优先队列+二路归并)

题目:UVA11997K Smallest Sums(优先队列+二路归并) 题目大意:求K个最小和。给出K行,每行有K个数,在每行中取一个元素相加,求这些和中最小的k的值。 解题思路:每一行排列一下,那么对于两张表a1                                                                             b1

862

OpenClaw + Antigravity + 飞书完整部署教程

在 Linux 服务器上部署 OpenClaw,使用 Antigravity 本地代理 AI 模型,并接入飞书实现 24 小时在线 AI 助手。

Maynor的博客 1785

Allegro如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层

在Allegro做PCB设计的时候,如果需要复制器件的位号到其它层是无法直接实现的,如果直接拷贝器件的位号的话,效果如下。但是Allegro的Cross Copy命令是支持复制任何属性的图形到其它层的,下面以复制器件位号和丝印外框为例说明。同样如果使用Z-copy命令,也是无法Z-copy text的,Finds下方texts是灰色的。如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层。另外cap处可以选择线段的端点是圆形,八角形,或者方形的铜皮。拷贝C1013,出现的是C*

weixin_54787054的博客 2671

UVA 11997--K Smallest Sums+优先队列用于多路归并

题目链接:点击进入 先考虑两个数组A,B的情况,这样总共有n^2种情况;将A,B数组排序后,我们可以将所有情况组织成n张表: 表1: A[1]+B[1]<=A[1]+B[2]<=……<=A[1]+B[n]. 表2: A[2]+B[1]<=A[2]+B[2]<=…….<=A[2]+B[n]. ……. 表n: A[n]+B[1]<=A[n]+B[2]<=……..<=A[n]+B[n] 这n张

荒野孤鹰 1483

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南

本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。

program哲学 294

UVA11997 K Smallest Sums 多路归并(优先队列)

//多路归并问题 //把k个有序表合并成一个有序表。 //大于2是两两归并 //本题只要求出k个最小的,所以可以限制上限 //k个整数数组,每个数组包含k个数,在每个数组中 //去一个数加起来,得到K^K个和 //求这些和中的最小的k个值 K Smallest Sums You're given k arrays, each array has k integers

1056

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

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

(UVa 11997)K Smallest Sums --多路归并问题,优先队列

题目链接: http://acm.hust.edu.cn/vjudge/problem/18702题意: 有k个数组,每个数组k个元素。在每个数组中取一个元素加起来,有k^k个和。求这些和中最小的k个(重复的值算多次)?分析: 我们先来求两个元素个数为n的且有序的数组A,B的前n个最小值。组合情况有n*n种,但是我们可以我这些和组织成如下有序表: 表1:A1+B1<=A1+B2<=A1+B3

STILLxjy 728

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

UVA11997 - K Smallest Sums 优先队列,多路归并

题目要求是从k个数组中各选一个数组成的和中最小的k个。 用到的是多路归并算法,详见汝佳神白书。先看看两个数组的情况,就会有如下几个表单 表1:A1+B1 表2: A2+B1 ................................... 表k:Ak+B1      可以很容易的知道,这里有K个表单(因为数组有K个元素),并且每个表单的最小值都是第一个(因

lwgkzl的博客 417

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

UVA 11997 K Smallest Sums 优先队列+归并 STL

  题目链接: UVA......   题目描述: 有K组数, 每组数有K个, 所以每组数各选一个加和有k^k种情况, 要求输出其中的最小的前k种, 从小到大输出   解题思路: 首先对于两个数组取前K个, 构造二元组(s, b) 其中s = Aa + Bb , a, b 为下标。 为什么不用三元组(s,a,b)呢, 因为二元组完全可以表示三元组, 下一个元素就是s+B[i+1]-B[i] ....

weixin_34266504的博客 172

K Smallest Sums UVA11997(多路归并问题) 优先队列

UVA11997 题意:k 个数组 每个数组 k 个数,每个数组取一个数有k^k种取法构成不同的和,问和的前k小的值。 思路: 要求k组,先考虑2组,a 数组, b数组。 取数方式有k^2 种,要从其中找到最小的k个, 对b数组排序, 可以先求出 a[0] + b[0] , a[1] + b[1] , … , a[k-1] + b[0] 存入优先队列, 之后 依次弹出前k小,同时判断如果b右边还...

Dave_lzw的博客 293

【UVA11997】K Smallest Sums 优先队列的多路归并问题

背景 给你个有序列表(假设非降序),将其合并为一个列表(这为《算法导论》上堆部分一道例题) 一种策略是建立一个大小为的小根堆,每个序列第一个元素入堆,标记每个元素所属队列. 依次取出,取出后若对应序列还有元素,则加入堆中否则不加入或者加入. PS:归并排序的归并过程就可以看作是大小为的一个小根堆进行合并的操作. 问题 有个序列,每个序列有个元素。现在要在每个序列里选一个元素出来求和,故...

Hardict的算法日记 413

uva 11997 K Smallest Sums 优先队列处理多路归并问题

题意:K个数组每组K个值,每次从一组中选一个,共K^k种,问前K个小的。 思路:优先队列处理多路归并,每个状态含有K个元素。详见刘汝佳算法指南。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<stack> 5 #include...

weixin_30338481的博客 121

UVA - 11997 K Smallest Sums 归并排序+优先队列

题目大意:有k个数组,每个数组选出一个数相加,相加后结果放到一个新的数组里,这样就这个数组就有k^k个数了,输出这个新的数组 最小的k个数解题思路:k^k,这样就不能暴力了,用归并排序这里说一下简单化的同类型问题问题为:假设有两个数量为n的数组,A和B,每个数组选出一个数相加并组成一个新的数组,输出这个新的数组的前n个最小值 先排序,然后暴力写出一下所有情况 A0 + B0 <= A0 + B1

静静地码 674

UVa 11997 K Smallest Sums (优先队列 & k路归并化为两两归并)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=497&page=show_problem&problem=3148 思路:k路归并化为两两归并 完整代码: /*0.172s*/ #include using namespace std; const int maxn

AC,∑ndless 1171

UVa 11997 (优先队列 多路归并) K Smallest Sums

考虑一个简单的问题,两个长度为n的有序数组A和B,从每个数组中各选出一个数相加,共n2中情况,求最小的n个数。 将这n2个数拆成n个有序表: A1+B1≤A1+B2≤... A2+B1≤A2+B2≤... ... An+B1≤An+B2≤... 然后用优先队列合并成一个有序表即可。队列中需要记录两个数的和s,以及在B中的下标b, 比如Aa+Bb出队以后,应该将Aa+B(b+1)= ...

weixin_30823001的博客 94

UVA ~ 11997 ~ K Smallest Sums (优先队列 + 多路归并)

题意:有k个整数数组,各包含k个元素。在每个数组中取一个元素加起来,可以得到k^k个和。求这些和中最小的k个值(重复的值算多次)。【输入格式】输入包含多组数据。每组数据第一行为一个整数k(1&lt;=k&lt;=750)。以下k行每行包含k个不超过10^6的正整数。输入结束标志为EOF。输入文件不超过5MB。【输出格式】对于每组数据,输出k个最小和的值,并按照从小到大排序。【分析】在解决这个问题之...

张松超的博客 260

uva 11997 K smallest sums (优先队列 多路归并)

算法入门经典 训练指南 p189 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; struct Item { int s,b; ...

weixin_30293079的博客 85

【优先队列之多路合并】UVA - 11997 K Smallest Sums

Source : UVA - 11997 K Smallest Sums http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18702题意有k个整数数组,各包含k个元素,从每个数组中选取一个元素加起来,可以得到k^k个和,求这些和中最小的k个值。 示例Sample Input 3 1 8 5 9 2 5 10 7 6

Hacker_vision 1090
上一篇: hihocoder1385 A Simple Job JAVA String split 字符串切割
下一篇: codeforces723D Lakes in Berland 搜索
Daemoonn
博客等级 码龄11年 42粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值