题面

在做这道题前,先要会他的弱化版(实际一模一样,只是愚蠢的洛谷评测级别差了一档(睿智如姬无夜))

----------------------------------弱化版---------------------

弱化版

实际只是把矩阵行数改成两行而已

sol:先排序,后考虑一个序列a[1]+b[1],a[2]+b[1],a[3]+b[1],······,a[n-1]+b[1],a[n]+b[1];

显然对于上一个序列而言 a[1]+b[1]<=a[1]+b[2], a[2]+b[1]<=a[2]+b[2], a[3]+b[1]<=a[4]+b[2]

虽然上面反应的只是以a分成的n个组中a[i]+(b[1]到b[2]到b[3]···到b[n])每组序列严格递增

但是利用小根堆就可以完成要求了每次弹出堆顶元素,在压入弹出元素组别的下一个数

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=;
int n,a[N],b[N],size=,to[N];
struct node{int key,id;}heap[N*];
inline void Up(int x)
{
while(x>)
{
if(heap[x].key<heap[x/].key)
{
swap(heap[x],heap[x/]); x/=;
}else break;
}return;
}
inline void Down(int x)
{
int y=x*;
while(y<=size)
{
if(y<size&&heap[y].key>heap[y+].key)y++;
if(heap[x].key>heap[y].key)
{
swap(heap[x],heap[y]); x=y; y=x*;
}else break;
}return;
}
inline void Insert(int v,int id){heap[++size]=(node){v,id};Up(size);}
inline node Top(){return heap[];}
inline void Pop(){swap(heap[],heap[size]);size--;Down();}
int main()
{
int i; node tmp; scanf("%d",&n);
for(i=;i<=n;i++)scanf("%d",&a[i]); for(i=;i<=n;i++)scanf("%d",&b[i]); sort(a+,a+n+); sort(b+,b+n+);
for(i=;i<=n;i++){Insert(a[i]+b[],i);to[i]=;}
for(i=;i<=n;i++)
{
tmp=Top(); Pop(); printf("%d ",tmp.key); Insert(a[tmp.id]+b[++to[tmp.id]],tmp.id);
}printf("\n");
}

----------------------------------强化版---------------------

这就是对于第一行,和第二行合并,得到新的序列,在用新序列与下一个合并,就解决了

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=;
int n,m,k,a[][N],b[N],size=,to[N];
struct node{int key,id;}heap[N*];
inline void Up(int x)
{
while(x)
{
if(heap[x].key<heap[x/].key)
{
swap(heap[x],heap[x/]); x/=;
}else break;
}return;
}
inline void Down(int x)
{
int y=x*;
while(y<=size)
{
if(y<size&&heap[y].key>heap[y+].key)y++;
if(heap[x].key>heap[y].key)
{
swap(heap[x],heap[y]); x=y; y=x*;
}else break;
}return;
}
inline void Insert(int key,int id){heap[++size]=(node){key,id};Up(size);}
inline node Top(){return heap[];}
inline void Pop(){swap(heap[],heap[size]);size--;Down();}
int main()
{
int i,j,t=; node tmp; scanf("%d%d%d",&n,&m,&k);
for(i=;i<=m;i++)scanf("%d",&a[t][i]); sort(a[t]+,a[t]+m+);
for(i=;i<=n;i++)
{
t^=; for(j=;j<=m;j++)scanf("%d",&b[j]); sort(b+,b+m+); size=;
for(j=;j<=k;j++)
{
Insert(a[t^][j]+b[],j); to[j]=;
}
for(j=;j<=k;j++)
{
tmp=Top(); Pop(); a[t][j]=tmp.key; Insert(a[t^][tmp.id]+b[++to[tmp.id]],tmp.id);
}
}for(i=;i<=k;i++)printf("%d ",a[t][i]);
}

最新文章

  1. PAT A 1119. Pre- and Post-order Traversals (30)【二叉树遍历】
  2. css选择符
  3. 写在学AngularJS之前
  4. 负载均衡算法(四)IP Hash负载均衡算法
  5. Firemonkey 指定 StringGrid 只能上下滾动,不要左右滚动
  6. problem
  7. 购买SSL证书到部署网站遇到的若干问题
  8. 快速开始使用Graph-tool - gt文件格式
  9. [转载]async &amp; await 的前世今生
  10. Zend Framework学习日记(2)--HelloWorld篇(转)
  11. 在CMD命令行下关闭进程的命令
  12. Java中的StringTokenizer类
  13. DVWA笔记之一:brute Force
  14. Python tkinter 学习记录(一) --label 与 button
  15. [LeetCode] 45. Jump Game II_ Hard tag: Dynamic Programming
  16. 怎样的操作才能让HashMap以红黑树类型存储数据? (文中没有解答该问题)
  17. highChart 缺值-曲线断开问题
  18. Android测试(三)——APK文件反编译
  19. 20190312 Windows安装Kafka
  20. 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay

热门文章

  1. Linux kernel 之 socket 创建过程分析
  2. python线程和进程编程对比
  3. 【USACO 2019 Feburary Contest】Gold
  4. Spark笔记-DataSet,DataFrame
  5. JDBC使用MYSQL的LOAD DATA LOACAL INFILE和LOAD DATA INFILE
  6. dpkg打包与解包
  7. vue开发小结(上)
  8. Bash : 冒泡排序
  9. Bash Shebang 小结
  10. Webpack 2 视频教程 005 - Webpack 编译输出日志