题面

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

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

弱化版

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

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]);
}

洛谷 P1392 取数的更多相关文章

  1. 洛谷P1392 取数 [堆]

    题目传送门 取数 题目描述 在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和.对于给定的数阵,请你输出和前k小的取数方法. 输入输出格式 输入格式: 第一行,三个数n, ...

  2. [洛谷P1392] 取数

    无法用复杂状态进行转移时改变计算方式:巧妙的整体考虑:压缩空间优化时间 传送门:$>here<$ 题意 给出一个n*m矩阵,从每一行选一个数加起来,可以得到一个和.易知总共会有$n^n$个 ...

  3. 洛谷P1288 取数游戏II(博弈)

    洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...

  4. 洛谷P1288 取数游戏II[博弈论]

    题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...

  5. 洛谷P1288 取数游戏II

    题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...

  6. 洛谷 p1123 取数游戏【dfs】

    题目链接:https://www.luogu.org/problemnew/show/P1123 转载于:>>>>>> 题目描述 一个N×M的由非负整数构成的数字矩 ...

  7. 洛谷 P1123 取数游戏

    题目描述 一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少. ...

  8. 洛谷——P1123 取数游戏

    P1123 取数游戏 题目描述 一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取 ...

  9. 洛谷P1288 取数游戏II 题解 博弈论

    题目链接:https://www.luogu.org/problem/P1288 首先,如果你的一边的边是 \(0\) ,那么你肯定走另一边. 那么你走另一边绝对不能让这条边有剩余,因为这条边有剩余的 ...

随机推荐

  1. xpath 的使用

    如需转发,请注明出处:小婷儿的python  https://www.cnblogs.com/xxtalhr/p/10520271.html 有问题请在博客下留言或加作者微信:tinghai87605 ...

  2. 每个大主播都是满屏弹幕,怎么做到的?Python实战无限刷弹幕!

    anmu 是一个开源的直播平台弹幕接口,使用他没什么基础的你也可以轻松的操作各平台弹幕.使用不到三十行代码,你就可以使用Python基于弹幕进一步开发.支持斗鱼.熊猫.战旗.全民.Bilibili多平 ...

  3. LED灯珠散热的计算方法

    LED灯珠散热的计算方法 来源: 时间:2014-09-23 13:55 [编辑:lufieliu] [字体:大 中 小] 我来说两句   一.热对LED的影响 1.LED是冷光源吗? (1)LED的 ...

  4. ADO.NET分享

    看到<c#从入门到精通(第三版)>书中对ado.net里几种方法打的比方,很有意思就发一下. 1)这张图中,把数据比作水,储存了大量数据. 2)Connection对象好像进水龙头,插在水 ...

  5. 一篇文章让你彻底掌握 shell 语言

    一篇文章让你彻底掌握 shell 语言 由于 bash 是 Linux 标准默认的 shell 解释器,可以说 bash 是 shell 编程的基础. 本文主要介绍 bash 的语法,对于 linux ...

  6. Luogu4768 NOI2018 归程 最短路、Kruskal重构树

    传送门 题意:给出一个$N$个点.$M$条边的图,每条边有长度和海拔,$Q$组询问,每一次询问从$v$开始,经过海拔超过$p$的边所能到达的所有点中到点$1$的最短路的最小值,强制在线.$N \leq ...

  7. 腾讯云 ubuntu 上tomcat加载项目很慢

    问题原因 随机数引起线程阻塞. tomcat不断启动,关闭, 启动关闭.几次后会出现卡死状况.需很久才能加载完成 阿里云同样配置,同样系统,则很难出现卡死状况.  即使出现过几十秒后也会释放出来. 而 ...

  8. Springboot 2.0.4 整合Mybatis出现异常Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

    在使用Springboot 2.0.4 整合Mybatis的时候出现异常Property 'sqlSessionFactory' or 'sqlSessionTemplate' are require ...

  9. .NetCore实践篇:成功解决分布式监控ZipKin聚合依赖问题(三)

    前言 读本篇文章之前,可以先读前两篇文章.为了照顾没看过的朋友,我也会稍作复习. 思考大纲: .Net架构篇:思考如何设计一款实用的分布式监控系统? 实践篇一:.NetCore实践篇:分布式监控客户端 ...

  10. .Net并行编程(一)-TPL之数据并行

    前言 许多个人计算机和工作站都有多个CPU核心,可以同时执行多个线程.利用硬件的特性,使用并行化代码以在多个处理器之间分配工作. 应用场景 文件批量上传 并行上传单个文件.也可以把一个文件拆成几段分开 ...