洛谷 P1392 取数
在做这道题前,先要会他的弱化版(实际一模一样,只是愚蠢的洛谷评测级别差了一档(睿智如姬无夜))
----------------------------------弱化版---------------------
实际只是把矩阵行数改成两行而已
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 取数的更多相关文章
- 洛谷P1392 取数 [堆]
题目传送门 取数 题目描述 在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和.对于给定的数阵,请你输出和前k小的取数方法. 输入输出格式 输入格式: 第一行,三个数n, ...
- [洛谷P1392] 取数
无法用复杂状态进行转移时改变计算方式:巧妙的整体考虑:压缩空间优化时间 传送门:$>here<$ 题意 给出一个n*m矩阵,从每一行选一个数加起来,可以得到一个和.易知总共会有$n^n$个 ...
- 洛谷P1288 取数游戏II(博弈)
洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...
- 洛谷P1288 取数游戏II[博弈论]
题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...
- 洛谷P1288 取数游戏II
题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...
- 洛谷 p1123 取数游戏【dfs】
题目链接:https://www.luogu.org/problemnew/show/P1123 转载于:>>>>>> 题目描述 一个N×M的由非负整数构成的数字矩 ...
- 洛谷 P1123 取数游戏
题目描述 一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少. ...
- 洛谷——P1123 取数游戏
P1123 取数游戏 题目描述 一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取 ...
- 洛谷P1288 取数游戏II 题解 博弈论
题目链接:https://www.luogu.org/problem/P1288 首先,如果你的一边的边是 \(0\) ,那么你肯定走另一边. 那么你走另一边绝对不能让这条边有剩余,因为这条边有剩余的 ...
随机推荐
- 论文列表 for Action recognition
要读的论文: https://www.cnblogs.com/hizhaolei/p/10565405.html 骨架动作识别论文汇总 https://blog.csdn.net/bianxuewei ...
- centos 6 中恢复删除的文件
CentOS 6 安裝 extundelete:: ##############测试的时候需要2块硬盘############### yum install e2fsprogs-devel e2fsp ...
- Ubuntu下 AndroidStudio 无法识别设备的问题
最近想搞一下 Android的软件开发 于是下决心,开始研究ubuntu 环境下android studio 的配置.对于我这个对APP一无所知的技术小白,还是遇到很多的问题. 1.先拔掉数据线,按下 ...
- 1-微信小程序开发(安装软件和运行第一个微信小程序)
https://developers.weixin.qq.com/miniprogram/dev/ 我的 打开 上传成功后
- 画线函数Glib_Line算法的研究
在这里首先先简单把我对函数的功能的理解阐述一下,方便后面的分析:Glib_Line函数实现的功能是通过参数给定(x1,y1,x2,y2,color),来确定起点(x1,y1)和终点(x2,y2)两 ...
- Docker(三):Dockerfile 命令详解
上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dockerfile 的使用,这篇文章我们来继续了解 Dockerfile ,学习 Dockerfile 各种命令的使用. Dock ...
- Qt5.9使用QWebEngineView加载网页速度非常慢,问题解决
折腾了大半天终于解决了 原帖地址:https://bugreports.qt.io/browse/QTBUG-44763 BUG单下的留言讲明了问题发生的原因,那就是系统默认设置为自动寻找代理,而使用 ...
- SpringBoot日记——ElasticSearch全文检索
看到标题的那一串英文,对于新手来说一定比较陌生,而说起检索,应该都知道吧. 这个ElasticSearch目前我们的首选,他主要有可以提供快速的存储.搜索.分析海量数据的作用.他是一个分布式搜索服务, ...
- WordPress更新时提示无法连接到FTP服务器的解决方案
这几天在搭建主站的时候,更新wordpress时无法连接到FTP原因服务器 解决方法如下: 在WordPress目录下找到wp-config.php文件并编辑,在最后一行加上: define('FS_ ...
- ULMFiT 阅读笔记
ULMFiT 阅读笔记 概述 这篇文章从文本分类模型入手,主要提出了两点:一是预训练语言模型在大中小规模的数据集中都能提升分类效果,在小规模数据集中效果尤为显著.二是提出了多种预训练的调参方法,包括D ...