(算法)前K大的和
题目:
1、有两个数组A和B,每个数组有k个数,从两个数组中各取一个数加起来可以组成k*k个和,求这些和中的前k大。
2、有N个数组,每个数组有k个数,从N个数组中各取一个数加起来可以组成k^N个和,求这些和中的前k大。
思路:
1、将A和B两个数组,按照从大到小排序,那么很容易得到下面的求和矩阵,假设为C,仔细一看,貌似有点规律。
C[0][0]=A[0]+B[0]肯定是最大的,那么候选的第二大的为max(C[0][1],C[1][0])。
我们通过堆来实现,每次从堆中找出最大值C[i][j],然后把C[i+1][j]和C[i][j+1]加入堆中,直至找到k个最大数。

2、先对前两个数组求前k大和,将结果与第三个数组求前k大和,然后第四个……直到第N个。
代码:
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm> using namespace std; struct node{
int i;
int j;
int val;
node(int x,int y,int v):i(x),j(y),val(v){};
/*
int operator<(node m) const{
return val-m.val;
}
*/
}; struct cmp{
bool operator()(const node &a,const node &b)const{
return a.val<b.val;
}
}; void getKthSum(const vector<int> &arr1,const vector<int> &arr2,int k,vector<int> &result){
int sz1=arr1.size();
int sz2=arr2.size(); if(sz1== || sz2==){
return;
} vector<vector<bool> > visited(sz1,vector<bool>(sz2,false));
priority_queue<node,vector<node>,cmp> pq;
int sum=arr1[]+arr2[];
pq.push(node(,,sum));
visited[][]=true;
//result.push_back(sum);
int count=; while(!pq.empty() && count<k){
node e=pq.top();
pq.pop();
result.push_back(e.val); count++;
int ex1=e.i+;
int ey1=e.j;
int ex2=e.i;
int ey2=e.j+;
if(ex1<sz1 && !visited[ex1][ey1]){
pq.push(node(ex1,ey1,arr1[ex1]+arr2[ey1]));
visited[ex1][ey1]=true;
}
if(ey2<sz2 && !visited[ex2][ey2]){
pq.push(node(ex2,ey2,arr1[ex2]+arr2[ey2]));
visited[ex2][ey2]=true;
}
}
} int main(){
int m,n,k;
while(cin>>m>>n>>k){
vector<int> result;
vector<int> arr1(m);
vector<int> arr2(n); for(int i=;i<m;i++)
cin>>arr1[i];
for(int i=;i<n;i++)
cin>>arr2[i];
sort(arr1.begin(),arr1.end(),greater<int>());
sort(arr2.begin(),arr2.end(),greater<int>());
getKthSum(arr1,arr2,k,result); for(int k=;k<result.size();k++)
cout<<result[k]<<" ";
cout<<endl;
}
return ;
}
(算法)前K大的和的更多相关文章
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...
- 7617:输出前k大的数
7617:输出前k大的数 查看 提交 统计 提问 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小 ...
- 输出前 k 大的数
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小 ...
- 牛客第六场 J.Heritage of skywalkert(On求前k大)
题目传送门:https://www.nowcoder.com/acm/contest/144/J 题意:给一个function,构造n个数,求出其中任意两个的lcm的最大值. 分析:要求最大的lcm, ...
- 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大
思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...
- 输出前k大的数
总时间限制: 10000ms单个测试点时间限制:1000ms内存限制:65536kB(noi) 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大 ...
- BZOJ2006:超级钢琴(ST表+堆求前K大区间和)
Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...
- HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场
题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆 ...
- 【分治】输出前k大的数
描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每个整 ...
随机推荐
- [Hdu4372] Count the Buildings
[Hdu4372] Count the Buildings Description There are N buildings standing in a straight line in the C ...
- [xsy3466]见面会
题意:有$n$个区间,把它们划分成若干段,如果一段$k$个区间的交长度$\geq2$,那么会产生$\binom k2$的贡献,最大化贡献 对每个$i$用单调栈预处理出$l_i$表示最小的$j$使得$j ...
- java的反射机制(第三篇)
本文转载自:http://c.biancheng.net/cpp/html/1782.html Person p=new Person();这是什么?当然是实例化一个对象了.可是这种实例化对象的方法存 ...
- [OpenGL]纹理贴图实现 总结
实现步骤 第一步:设置所需要的OpenGL环境 设置上下文环境 删除已经存在的渲染的缓存 设置颜色缓存 设置帧缓存 清除缓存 设置窗口大小 开启功能 编译shander 使用program 获取sha ...
- 华为S5300系列升级固件S5300SI-V100R006C00SPC800.cc
这个固件附带了web,V100R005可以直接升级到这个版本,但没什么必要,因为V100R005本身可以直接升级到V200. 升级小插曲: 1.升级的使用使用Windows,不要用Mac或者Linux ...
- unity热更新
Unity3D 学习笔记4 —— UGUI+uLua游戏框架 C#Light 和 uLua的对比第二弹 在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理 Ulua_toLua_基本案例 Uni ...
- Lingoes 一款功能强大、简明易用的多语言词典和文本翻译软件
Lingoes 软件自述 Lingoes 是一款功能强大.简明易用的多语言词典和文本翻译软件,支持多达80种语言互查互译,这些语言包括 英.法.德.意.俄.中.日.韩.西.葡.阿拉伯语 及更多... ...
- 用 Apache 发布 ASP.NET 网站
由于服务器需要发布 JSP .PHP.ASP.NET 几种网站进行测试,Apache 肯定是支持 JSP 和 PHP .鉴于 Apache 的开放精神 ,ASP.Net 应该也是支持的,于是乎 Go ...
- [self removeAllSubviews]; // 删除所有子视图(包括 selfl.view) 所以,要慎用
[self removeAllSubviews]; //删除所有子视图(包括 selfl.view) 所以,要慎用
- 一种基于ES5的JavaScript继承
关于JavaScript继承,方式非常多,包含compile-to-javascript的语言TypeScript, CoffeeScript以及站点MDN, GitHub, Modernizr各种p ...