AcWing:146. 序列(小根堆 + 数学归纳 + 贪心)
给定m个序列,每个包含n个非负整数。
现在我们可以从每个序列中选择一个数字以形成具有m个整数的序列。
很明显,我们一共可以得到nmnm个这种序列, 然后我们可以计算每个序列中的数字之和,并得到nmnm个值。
现在请你求出这些序列和之中最小的n个值。
输入格式
第一行输入一个整数T,代表输入中包含测试用例的数量。
接下来输入T组测试用例。
对于每组测试用例,第一行输入两个整数m和n。
接下在m行输入m个整数序列,数列中的整数均不超过10000。
输出格式
对于每组测试用例,均以递增顺序输出最小的n个序列和,数值之间用空格隔开。
每组输出占一行。
数据范围
0<m≤10000<m≤1000,
0<n≤20000<n≤2000
输入样例:
1
2 3
1 2 3
2 2 3
输出样例:
3 3 4
算法:二叉堆(小根堆) + 数学归纳 + 贪心
题解:我们先看一下样例,可以分解为1+2 1+2 1+3 2+2 2+2 2+3 3+2 3+2 3+3这9个数,然后找出前3个最小的,答案自然就是3 3 4啦。
当m == 2时,我们先将数组a,b排序然后就可以得到这样一个序列和:
b[1]+a[1] b[1]+a[2] ...... b[1]+a[n]
b[2]+a[1] b[2]+a[2] ...... b[2]+a[n]
......
b[n]+a[1] b[n]+a[2] ...... b[n]+a[n]
其中的序列和都是从小到大排序的,因为a和b数组都是有序的,所以我们只要将序列和的第一个都放入小根堆中,如果当前的第一个取出来了,我就把第二个放入小根堆中,依此类推。
注意:其中a数组中的每个元素都是前面几个序列和的最小的n个元素。
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm> using namespace std; const int maxn = 2e3+; priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q; int n, m;
int a[maxn], b[maxn], c[maxn]; int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d %d", &m, &n);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
}
sort(a + , a + n + );
for(int j = ; j <= m; j++) {
while(!q.empty()) { //清空上一次获取前n个最小的数之后的无用值
q.pop();
}
for(int i = ; i <= n; i++) {
scanf("%d", &b[i]);
}
sort(b + , b + n + );
for(int i = ; i <= n; i++) {
q.push(make_pair(a[] + b[i], ));
}
for(int i = ; i <= n; i++) {
pair<int, int> v = q.top();
q.pop();
c[i] = v.first;
q.push(make_pair(v.first + a[v.second + ] - a[v.second], v.second + )); //这里是移动a数组的下标,上次用到了a[v.second],所以这次要减掉,加上新的值
}
for(int i = ; i <= n; i++) { //把更新后的最小数组赋值给a数组
a[i] = c[i];
}
}
for(int i = ; i <= n; i++) {
printf("%d%c", a[i], " \n"[i == n]);
}
}
return ;
}
AcWing:146. 序列(小根堆 + 数学归纳 + 贪心)的更多相关文章
- AcWing:145. 超市(贪心 + 小根堆 or 贪心 + 并查集)
超市里有N件商品,每个商品都有利润pipi和过期时间didi,每天只能卖一件商品,过期商品(即当天di<=0di<=0)不能再卖. 求合理安排每天卖的商品的情况下,可以得到的最大收益是多少 ...
- AcWing:111. 畜栏预定(贪心 + 小根堆)
有N头牛在畜栏中吃草. 每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏. 给定N头牛和每头牛开始吃草的时间A以及结束吃草的时间B,每头牛在[A,B]这一时间段内都会一直吃草. 当两头 ...
- bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle——小根堆+大根堆+贪心
Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...
- [CSP-S模拟测试]:梦境(贪心+小根堆)
题目描述 智者奥尔曼曾说过:有缘的人即使相隔海角天涯,也会在梦境中相遇. $IcePrince\text{_}1968$和$IcePrincess\text{_}1968$便是如此.有一天$IcePr ...
- 随手练——HDU Safe Or Unsafe (小根堆解决哈夫曼问题)
HDU 2527 :http://acm.hdu.edu.cn/showproblem.php?pid=2527 哈夫曼树,学完就忘得差不多了,题目的意思都没看懂,有时间复习下,看了别人的才知道是怎么 ...
- 关于dijkstra的小根堆优化
YY引言 在NOI2018D1T1中出现了一些很震惊的情况,D1T1可以用最短路解决,但是大部分人都在用熟知的SPFA求解最短路.而SPFA的最坏复杂度能够被卡到$O(VE)$.就是边的数量乘以点的数 ...
- scala写算法-用小根堆解决topK
topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...
- 让priority_queue支持小根堆的几种方法
点击这里了解什么是priority_queue 前言 priority_queue默认是大根堆,也就是大的元素会放在前面 例如 #include<iostream> #include< ...
- T-shirt buying CodeForces - 799B (小根堆+STL)
题目链接 思路: 由于题目说了只有1,2,3,三种色号的衣服,然后开三个对应色号的小根堆, 我是根据pair<int,int> 创建了一个以价格小的优先的优先队列. pair中的另外一个i ...
随机推荐
- MySQL中的数据库对象
1.数据库中一般包含下列对象 表.约束.索引.触发器.序列.视图: 可以使用图形用户界面或通过显式执行语句来创建这些数据库对象.用于创建这些数据库对象的语句称为“数据定义语言”(DDL),它们通常以关 ...
- pycharm2017.3.3永久激活(转载)
pycharm是很强大的开发工具,但是每次注册着实让人头疼.网络上很多注册码.注册服务器等等.但都只是一年或者不能用:为次有如下解决方案.亲测有效!!! 如果想让pycharm永久被激活,比如截止日到 ...
- Bootstrap页面响应式设计
关键词:viewport.栅格布局.媒体查询(Media Queries) 一.关于栅格布局的说明: 1.基本图解 extra small devices phones 超小型设备手机small d ...
- warning LNK4076: 无效的增量状态文件“../×××.ilk”;正在非增量链接
VS编译警告:warning LNK4076: 无效的增量状态文件“../×××.ilk”;正在非增量链接 解决方法:删除程序提示的输出目录的×××.ilk,重新编译,即可
- 关于spring中AOP的几件小事
0.AOP简介 AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是穿透OOP的补充. AOP的主要编程对象是切面(aspect),而切面模块化横切关注 ...
- Jquery 学习-菜鸟教程
jquery效果和元素选择 //元素选择 $(this).hide(); $("p.test") //隐藏所有class="test"的<p>元素 ...
- selenium:能够模拟人类打开浏览器的爬虫利器
介绍 selenium相当于是一个机器人,可以模拟人类登陆浏览器的行为,比如点击.填充数据.删除cookie等等.Chromedriver是一个驱动Chrome的程序,使用它才可以驱动浏览器,其实Ch ...
- Mark点
MARK点是PCB应用于设计中的自动贴片机上的位置识别点,也被称为基准点.直径为1MM.钢网Mark点是电路板贴片加工中PCB印刷锡膏/红胶时的位置识别点.Mark点的选用直接影响钢网的印刷效率,确保 ...
- 腾讯数据安全专家谈联邦学习开源项目FATE:通往隐私保护理想未来的桥梁
数据孤岛.数据隐私以及数据安全,是目前人工智能和云计算在大规模产业化应用过程中绕不开的“三座大山”. “联邦学习”作为新一代的人工智能算法,能在数据不出本地的情况下,实现共同建模,提升AI模型的效果, ...
- 实际应用脚本备份1——Ubuntu下应用升级脚本与执行方法
程序自动更新脚本,命名为makefile: build:run run: killall java /webapps/‘应用目录名’/ /webapps/ ‘应用目录名’/ cd /opt/apach ...