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;
}
Codex VS Claude Code 全面测评!代码开发到底选谁? 评测结果6项指标(设计质量、提示遵从度、响应式、代码质量、细节关注、惊喜度)虽未公布最终赢家,但实测本身已揭示两工具在前端任务上的直接差异。Codex基于OpenAI的云沙箱架构,API通过全球CDN分发,但在国内直连时,依赖特定网络环境。:纯终端工具,直接在你的iTerm或终端中运行,不新建窗口、不切换上下文,与本地开发环境无缝融合。GPT-5.3 Codex(xhigh)输入$1.75/百万token,输出$14.00/百万token,混合均价约**$4.81/百万token**。 阅读详情

相关推荐

时序约束实战:从setup/hold到时钟路径约束的深度解析

本文深度解析数字设计中的时序约束实战,重点探讨如何从setup/hold检查的核心原理出发,理解并应用时钟路径约束。文章通过剖析Path Requirement的计算逻辑,结合同频、倍频及异步时钟域等典型场景,提供了从解读时序报告到编写、调试SDC约束的系统方法,帮助工程师有效应对复杂SoC设计中的时序收敛挑战。

weixin_29291185的博客 105

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

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

PushyTao的博客 1130

从零开始深入理解 AI Agent(完整版)

AI Agent(智能体)是一个能够自主感知环境、做出决策、执行行动并记忆经验的智能系统。特性传统程序AI Agent决策方式固定逻辑(if-else)动态推理(LLM 思考)灵活性需要重新编程自然语言描述即可能力边界明确限定可通过工具扩展学习能力无可通过记忆积累经验│ 感知 │ ───→ │ 推理 │ ───→ │ 行动 │↑ │ ││ ↓ ││ 记忆 │ ←─── │ 反思 │ ←─────────┘感知(Perception)

qq_20096229的博客 754

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

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

wangqsse的博客 887

从入门到实战:rkhunter(Rootkit猎手)在Linux服务器安全运维中的部署与自动化监控

本文详细介绍了rkhunter(Rootkit猎手)在Linux服务器安全运维中的部署与自动化监控方法。从Rootkit的危害性入手,讲解了rkhunter的安装、配置及实战应用,包括如何建立基准、优化定时任务方案以及智能告警处理。通过多级过滤脚本和系统级联动,帮助运维人员高效识别和应对Rootkit威胁,提升服务器安全性。

weixin_28715953的博客 238

Linux Component概述和高通component的使用

为了让subsystem按照一定顺序初始化设备才提出来的。subsystem中由很多设备模块,内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video device),这时就要用到component框架。例如v4l2 subdev和v4l2 video device中,谁依赖谁先创建?

lz_1990的专栏 1610

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

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

方圆 Blog 670

Camunda流程引擎 Modeler (二)

Camunda Modeler是Camunda官方提供的建模器: 独立安装的建模器([windows、linux、mac]

1311

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

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

Mylvzi的博客 1281

ESP32-BLE学习1-建立简单的server

start 学习之前,我想尝试使用ESP32的demo建立一个简单的server与手机接进行最基本的数据通信。 这里有BLE的简单讲解BLE资料 因为BLE的连接是具有主从机特性的,就像SPI,USB一些请求只能由主机端发起,连接也需要主机端发起。所以手机要想连上ESP32,就得将ESP32设置为从机模式。 从资料上可以看到,从机端通过Notify通知主机,所以从机就是GATT Server。 在进行ESP32 的demo学习之前,得大体看下ESP32的蓝牙组成,ESP32支持经典蓝牙和低功耗蓝牙4.2,

Spark的博客 1841

电机瞬态分析基础(2):理想电机的基本假设和正方向规定

电机瞬态分析基础之理想电机假设条件和正方向规定

weixin_45670943的博客 1145

数据流中的第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

YOLOv26全流程实战手册:从yaml配置拆解到训练推理参数调优(附虚拟环境搭建)

以“车辆、行人、小型物体”3类数据集为例,修改# 1. 修改类别数nc: 3# 2. 调整锚框(适配小目标)anchors:- [12,16, 16,24, 33,23] # 增加小锚框# 3. 轻量化调整(边缘部署)depth_multiple: 0.25 # 降低深度系数width_multiple: 0.20 # 降低宽度系数# 其余Backbone/Head结构不变yaml配置:核心是调整nc(类别数)、(轻量化)、anchors(适配目标尺度);虚拟环境。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 877

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【优先队列之多路合并】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
上一篇: 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、付费专栏及课程。

余额充值