K Smallest Sums(优先队列+思维推广)

UVA - 11997:K Smallest Sums UVA-11997:K Smallest Sums 来源:UVA 标签:数据结构、优先队列 参考资料:《算法竞赛入门经典训练指南》P189 相似题目: 题目 You’re given k arrays, each array has k integers. There are k ways to pick exactly one element in each array and calcu... 阅读详情

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 them.
Input
There will be several test cases. The first line of each case contains an integer k (2 ≤ k ≤ 750). Each of
the following k lines contains k positive integers in each array. Each of these integers does not exceed
1,000,000. The input is terminated by end-of-file (EOF).
Output
For each test case, print the k smallest sums, in ascending order.
Sample Input
3
1 8 5
9 2 5
10 7 6
2
1 1
1 2
Sample Output
9 10 12
2 2

给了n*n的数,每一行只能选一个数,然后n列选出n个数,他们的和记录下来,求最小的k个和(选的方式不同就算不一样的)

一开始想法就是优先队列,因为n的n次方肯定会炸,一定有的东西是要不搜的,就想到先对每行排序,然后最小的就可以出来,把每行后面的数与这行最小的数进行比较,然后根据差值入队,找次小,但是很快发现,这是没有一个标准比较的,意思就是根据入队不能将满足条件的数用队列表示出来。

然后看了lrj的想法- -,先是简化版的,只有两列数,那么就会有一个表(先对每一行排序)
a1 + b1 <= a1 + b2 <= a1 + b3 <= ……<=a1 + bn
a2 + b1 <= a2 + b2 <= a3 + b3<= ……<= a2 + bn
……
an + b1 <= an + b2 <= an + b3 <= …… <= an + bn
这样做的目的就是可以每次找出n个数,来代表所有的数,因为最小值一定在这n个数中产生。
这里还有一个存储技巧,就是用(s,b)来进行操作
(s,b)就是s = Aa +Bb;那么(s,b + 1) = (s,b) - Bb + B(b + 1);就可以了

现在这里是n行,就需要把这个想法推广。
假设我之前找了n个最小值,那么再来一行n个数,就算我只用了这里面的一个数,我也可以产生n个最小值,意思就是说,无论多么极限,更新之后的n个最小值一定是从这n个里面产生的。
数学归纳的思想。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
int a[800],b[800];
int ans[800];
int leap[800];
struct Node
{
    int y,num;
    bool operator < (Node a)const
    {
        return num > a.num;
    }
};
void work(int n)
{
    priority_queue<Node>p;
    Node temp;
    Node now;
    for(int i = 1;i <= n;i++)
    {
        temp.num = a[i] + b[1];
        temp.y = 1;
        p.push(temp);
    }
    for(int i = 1;i <= n;i++)
    {
        temp = p.top();p.pop();
        a[i] = temp.num;
        if(temp.y < n)
        {
            now.num = temp.num - b[temp.y] + b[temp.y + 1];
            now.y = temp.y + 1;
            p.push(now);
        }
    }
}
int main()
{
#ifdef LOCAL
    freopen("C:\\Users\\ΡΡ\\Desktop\\in.txt", "r", stdin);
    //freopen("C:\\Users\\ΡΡ\\Desktop\\out.txt","w",stdout);
#endif // LOCAL
    int n;
    while (scanf("%d", &n) != EOF)
    {
        for(int i = 1;i <= n;i++)
            scanf("%d",&a[i]);
        sort(a + 1,a + 1 + n);
        for(int i = 2;i <= n;i++)
        {
            for(int j = 1;j <= n;j++)scanf("%d",&b[j]);
            sort(b + 1,b + 1 + n);
            work(n);
        }
        for(int i = 1;i <= n;i++)
        {
            printf("%d",a[i]);
            if(i < n)printf(" ");
            else printf("\n");
        }
    }
    return 0;
}
龙芯3A5000开发板PMON升级UEFI固件实战指南 固件是计算机硬件与操作系统之间的关键桥梁,负责初始化硬件并引导系统启动。其工作原理是在上电后执行自检、加载引导程序,最终将控制权移交操作系统。在国产化平台中,采用标准化的UEFI固件具有重要技术价值,它能提供图形化配置界面、统一硬件驱动模型,并支持安全启动等现代特性,从而显著提升硬件兼容性与系统管理效率。这一技术广泛应用于PC、服务器及嵌入式设备,尤其在需要运行银河麒麟等主流操作系统的龙芯开发板场景中,将传统PMON固件升级至UEFI,能实现更流畅的系统安装与更稳定的运行体验。本文基于固件升级与UEFI引导 阅读详情

相关推荐

CMOS sensor 基础

NA

m0_72053187的博客 1657

K优先队列——对顶堆(大根堆+小根堆)

题目描述 你需要维护一个队列,支持以下两种操作: 1.加入一个非负整数x; 2.取出当前队列中第k大的数字。 保证进行第二种操作时,队列中至少有k个数字。 部分数据经过加密,你需要依次处理每个操作才能获得正确的下一个操作。 输入 第一行包括三个非负整数n,k,p,分别表示操作次数,参数k以及数据是否进行过加密。 接下来n行,每行先给出一个数opt,表示操作类型。若opt=1,接下来还会有一个非负整数x,若p=0,表示往队列中加入x,若p=1,表示往队列中加入x异或上前一次出队操作取出的数字后得到的结果,如果

PushyTao的博客 1130

从零部署DeepSeek V4 Flash:NVIDIA DGX Spark实战指南

GPU加速计算已成为现代人工智能基础设施的核心,其原理是通过并行处理架构大幅提升深度学习模型的训练与推理效率。在AI工程实践中,NVIDIA GPU凭借CUDA生态和专用驱动栈,为大规模语言模型部署提供了硬件基础。本文聚焦于企业级AI服务器部署场景,针对NVIDIA DGX Spark多节点系统的硬件初始化、驱动兼容性配置、容器化部署等关键环节,提供从系统层到应用层的完整解决方案。通过vLLM推理框架的实战配置,演示如何将DeepSeek V4 Flash模型高效部署于多GPU环境,涵盖Tensor Par

weixin_32296621的博客 377

找出最小的K个数——优先队列和选择算法(分治思想)两种方式

题目:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 1、优先队列解法 (1)分析: 定义一个PriorityQueue类型的优先队列queue,在初始化时指定队列为固定大小k,只能存储k个元素,同时自定义优先队列的优先规则(排序规则)(PriorityQueue用法单独写个博客来梳理)。从头到尾遍历数组元素,当queue中元素不等于k时,队列不满,数组中元素加入队列;当...

wangqsse的博客 887

手把手教你用Isaac Sim 8打造逼真光影效果:参数设置与场景应用

本文详细介绍了如何使用Isaac Sim 8打造逼真光影效果,涵盖基础参数设置、高级材质交互、专业级灯光造型技法以及复杂场景的灯光布局策略。通过实战案例和参数调优技巧,帮助用户提升虚拟场景的视觉表现,适用于数字孪生、虚拟仿真和影视特效等领域。

weixin_30836759的博客 78

开源PACS系统Orthanc(DICOM服务器)配置

PACS(Picture Archiving and Communication System)是医学影像的数字化存储、检索和传输系统,用于管理和存储医学图像和相关信息,如放射学、核医学、超声、病理学等各种医学影像。PACS系统通过数字化技术取代了传统的胶片方式,使医疗机构能够更高效地存储、传输和查看医学图像,从而提高了医疗图像的管理和工作流程。

qq_42231043的博客 6249

一文搞懂优先队列及相关算法

大家好,我是。优先队列在 Java 中的定义是 PriorityQueue,它基于数据结构实现,其中的元素并不是全部有序,但它能够支持高效地。二叉堆是一种特定条件的,树的根节点为堆顶,最右端叶子节点为堆底,分为和。小顶堆堆顶元素最小,且任意节点小于等于其子节点,大顶堆堆顶元素最大,且任意节点大于等于其子节点,如下图所示:完全二叉树只有叶子节点未被填满,且叶子节点从左向右进行填充。优先队列可以用于解决和,下面我们先来看一些练习。如果大家想要找刷题路线的话,可以参考。

方圆 Blog 670

避坑指南:Abaqus网格划分中90%用户会遇到的5个质量陷阱(附解决方案)

本文深入剖析Abaqus网格划分中90%用户会遇到的5个典型质量陷阱,包括单元扭曲、扫掠网格失败、尺寸梯度控制等,并提供工程级解决方案。通过Python脚本和虚拟拓扑等技巧,帮助用户提升网格质量,确保有限元分析结果的可靠性,适用于CAE工程师和仿真分析师。

weixin_29243279的博客 98

数据结构之优先级队列(堆)及top-k问题讲解

堆是一种把元素按大小排列的完全二叉树,堆就是进行数据高效组织的另一种形式从小到大排列:小根堆(每棵树的根节点的值比当前树的所有孩子都小)从大到小排列:大根堆(每棵树的根节点的值比当前树的所有孩子都大)大根堆示例:小根堆示例:Java的集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,此处主要介绍PriorityQueue。

Mylvzi的博客 1281

Java黑皮书课后题第5章:*5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生

*5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生名字、次高分的学生名字题目题目概述next()读取一个字符与nextLine()读取一行破题代码 题目 题目概述 *5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生名字、次高分的学生名字 使用Scanner类的next()方法而不是nextLine()方法来读取名字 next()读取一个字符与nextLine()读取一行 举个例子理

weixin_46356698的博客 2154

Open3D 使用RANSAC分割平面【2026最新版】

使用RANSAC从点云中分割平面,用segement_plane函数。博客长期更新,本文最新更新时间为:2026年2月28日。

点云侠的博客 37万+

数据流中的第K大元素——优先队列

题目链接:https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/ 设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。 你的KthLargest类需要一个同时接收整数k 和整数数组nums的构造器,它包含数据流中的初始元素。每次调用KthLargest.add,返回当前数据流中第K大的元素。 示例: int k = 3; int[] arr = [4,5,8,2]; K...

曹健的博客 356

前言:关于作者吴秋生博士与此书简介

博士现为田纳西大学,诺克斯维尔分校,地理系的副教授。他的研究兴趣包括地理信息科学(GIS)、遥感和环境建模。更具体地说,对应用地理空间大数据、机器学习和云计算(例如,谷歌地球引擎、微软行星计算机)来研究环境变化,特别是地表水和湿地淹没动态。吴博士是开放科学和可重复研究的倡导者。他开发了几个用于高级地理空间分析的开源软件包(例如,吴博士还在YouTube上发布了数百个有关GIS和地图绘制的视频。更多有关他的开源项目信息,请访问GitHub(查看他的YouTube频道。.....................

韩天放 6087

UVA 11997 K Smallest Sums

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3148 虽然是水题,需要用到优先队列...但还是考一点思维 题意是找出n*n的矩阵中,每行中取一个数求sum的前k小值... 可以很容易想到是求两行中的前k小然后合并...但是求...

weixin_30646315的博客 138

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

K Smallest Sums 多路归并优先队列

K Smallest SumsYou're given k arrays, each array has k integers. There are kk ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest ...

Xuedan_blog的博客 413

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

UVA 11997 K Smallest Sums(多路合并)

这里先把每个序列排序,然后依次和a[1]这个序列合并,那么a[1]这个序列中放的就是最终的结果了。#include #include #include #include #include using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define ss(x) scanf("%d",&x) const int m

qq_33901573的博客 253

【优先队列之多路合并】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

优先队列解决K大K小问题

K大K小问题 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 class Solution { /** 优先队列 + HashMap: 先HashMap统计元素的频率 创建优先队列,根据频率从小到大存放元素,当队列元素超过k个时,出队,最后剩下k个元素就是频率最大的k个元素 */ public int[] topKFrequent(int[] nums, int

shao1996的博客 185

STL - priority_queue(优先队列)用法总结

(我的STL相关的博客目录:https://blog.youkuaiyun.com/Kprogram/article/details/90408011) (priority_queue-c++官网:http://www.cplusplus.com/reference/queue/priority_queue/) (什么是队列以及普通队列的用法移步这里:https://blog.youkuaiyun.com/Kprog...

Kprogram的博客 995

【UVA11997】K Smallest Sums

题意   有nn个序列,每个序列有nn个元素。现在要在每个序列里选一个元素出来,求元素总和前nn小的值 解法 优先队列:   最简单的想法就是直接枚举所有可能的方案,然后排序求出前nn小的方案   我们用一个nn元组来表示一种组合   首先我们把每个序列从小到大排好序,那么最小的组合就是(1,1,…,1)了,至于第二小,在某个

清疚的博客 383

K Smallest Sums

K Smallest Sums 题意:有k个数组,每个有k个元素,在每个数组里面取一个数加起来,问最小的k个数。 思路:多路归并,优先队列维护。 #include<bits/stdc++.h> using namespace std; int a[755][755]; int n; struct node{ int s,b; node(int s,int b):s(s),b...

天真有邪的博客 415

K Smallest Sums (数据结构)UVA - 11997

K Smallest Sums(排序)You’re given k arrays, each array has k integers. There are kk ways to pick exactly one element in eacharray and calculate the sum of the integers. Your task is to find the k smalle...

FIVE 358

【NOI2015T4】荷马史诗-优先队列实现K进制哈夫曼编码+贪心

【NOI2015T4】荷马史诗-优先队列实现K进制哈夫曼编码+贪心

Maxwei_wzj的OI世界 1119

LeetCode | 347. Top K Frequent Elements 优先队列技巧题

Givena non-empty array of integers, return the k mostfrequent elements. Forexample, Given [1,1,1,2,2,3] and k = 2, return [1,2]. Note:  You may assume k is always valid, 1 ≤ k ≤ number of uniq

u012737193的博客 382

UVA 11997 - K Smallest Sums(多路归并)

题目链接:点击打开链接 思路:多路归并。 用贪心的规则, 我们先考虑两个数组的情况, 如果将两个数组从小到大排序, 那么我们先将数组a的所有元素加上数组b的最小的元素, 然后放入优先队列。 因为是事先排好序的, 所以其中肯定有一个是最小的,那么当这个数取出来之后, 如何保证队列头上时次小的呢? 我们发现, a数组的所有元素都用上了, 而且是和b数组中最小的数相加得到的, 所以, 当a[0]+b[

AC_Arthur的专栏 4160

UVa - 11997 - K Smallest Sums

题意:输入一个数k(2 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=229&page=show_problem&problem=3148 ——>>k个数的和最小,那么任意两行的那两个数的和也最小,否则就可以找到比该值更小的数,所以,可以先求两行中k个最小和,再进行多路归并

那也行啊 472

优先队列 priority_queue 详解

优先队列 重要通知!!!!!!!!!!!!! 优先队列没有back()操作!!!!! 误人子弟Crloss已经自毙了!!!!! 同时更正了一些小问题,如果想直接知道结果,可以直接跳过验证部分到最下方。 ——2018.11.03 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解,点“击”查看。 那么优先队列是什么呢? 说白了,就是一种功能强大的队列。如果不太清楚队列,可以看看我这篇博...

湛蓝的天空 2555
上一篇: Layout(差束约分系统)
下一篇: cf599C Day at the Beach(区间合并)
Techay
博客等级 码龄11年 11粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值