洛谷1631 序列合并
来源:互联网 发布:linux 保存退出 编辑:程序博客网 时间:2024/06/08 05:17
题目描述
有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。
输入输出格式
输入格式:
第一行一个正整数N;
第二行N个整数Ai,满足Ai<=Ai+1且Ai<=10^9;
第三行N个整数Bi, 满足Bi<=Bi+1且Bi<=10^9.
【数据规模】
对于50%的数据中,满足1<=N<=1000;
对于100%的数据中,满足1<=N<=100000。
输出格式:
输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。
输入输出样例
输入样例#1: 复制
3
2 6 6
1 4 8
输出样例#1: 复制
3 6 7
思路是先把第二组的第一个数和第一组所有数相加,建立一个大根堆,再把第二组第二个数与第一组所有数相加,如果小于堆顶就把堆顶换了,维护堆,如果大则第二组第三个数,以此类推,直到第二组第n个数与第一组第一个数相加小于堆顶,则输出堆。
#include<bits/stdc++.h>using namespace std;const int MAXN=100005;bool flag; int n,a[MAXN],b[MAXN],f[MAXN],cnt,k=1,ff[MAXN];void pus(int x){ cnt++;f[cnt]=x; int now=cnt; while(now>1){ if(f[now]<f[now/2]) break; swap(f[now],f[now/2]); now/=2; }}void del(){ int now=1; while(now*2<=cnt){ int tp=now*2; if(f[tp]<f[tp+1] && tp<cnt) tp++; if(f[tp]<f[now]) break; swap(f[tp],f[now]); now=tp; }}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) pus(b[1]+a[i]); while(!flag && k<n){ k++; for(int i=1;i<=n;i++){ if(i==1 && b[k]+a[i]>f[1]){flag=1;break;} if(b[k]+a[i]>=f[1]) break; f[1]=b[k]+a[i]; del(); } } sort(f+1,f+1+n); for(int i=1;i<=n;i++) printf("%d ",f[i]); return 0;}
还有一种简单写法,思路一样
#include<bits/stdc++.h>int a[100010],b[100010],num[100010],n;int main() { scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); for(int i=1; i<=n; i++) scanf("%d",&b[i]); for(int i=1; i<=n; i++) num[i]=1; for(int i=1; i<=n; i++) { int temp=1; int rmin=1000000000; for (int j=1; j<=n; j++) { if(a[j]+b[num[j]]<rmin) { temp=j; rmin=a[j]+b[num[j]]; } if(a[j]+b[num[n]]>rmin) { num[temp]++; break; } } printf("%d ",rmin); } return 0;}
阅读全文
0 0
- 洛谷1631 序列合并
- 序列合并 洛谷1631 堆
- 洛谷 1631 序列合并 堆 解题报告
- 洛谷 P1631 序列合并
- 洛谷P1631 序列合并
- 洛谷P1631 序列合并
- 洛谷 P1631 序列合并
- 洛谷 P1631 序列合并
- 洛谷P1631 序列合并
- 洛谷 P1631 序列合并
- 洛谷P1631 序列合并
- 洛谷 P1631 序列合并
- 【洛谷】P1628 合并序列
- |洛谷|堆|P1631 序列合并
- 洛谷 堆专题 序列合并
- 洛谷2085最小函数值(minval) + 洛谷1631序列合并
- 堆or优先队列(洛谷1631 序列合并)
- 序列合并
- 174. Spring Boot WebSocket:群聊-昵称
- linux Tomcat详解
- ubuntu系统安装流程
- 6卡驱动win7系统,挖矿6卡驱动
- 多线程
- 洛谷1631 序列合并
- 操作系统 第10章
- 深入分析java传参
- lintcode---转换成回文串(leetcode---Shortest Palindrome)
- ImageLoader--pizifusheng
- 进程间通信方式
- 李航博士的《浅谈我对机器学习的理解》
- http协议&Tomcat
- 购物车页面