洛谷 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\) ,那么你肯定走另一边. 那么你走另一边绝对不能让这条边有剩余,因为这条边有剩余的 ...
随机推荐
- https安全协议原理
那么什么是HTTPS? HTTPS(Hypertext Transfer Protocol Secure)是一种通过计算机网络进行安全通信的传输协议.HTTPS经由HTTP进行通信,但利用TLS来加密 ...
- Objective-C 图片处理
图片处理 编码 解码 imageNamed
- xrange 和range的区别
>>> xrange(5)xrange(5)>>> list(xrange(5))[0, 1, 2, 3, 4]>>> xrange(1,5)xr ...
- SkylineGlobe 6.5 如何实现简单多边形的动态绘制 C#示例代码
在Skyline的TEPro软件中,我们可以很容易地绘制出多边形. 那么,在二次开发过程中,该如何绘制一个简单的多边形呢? 通过下面的示例代码,我们可以很容易完成这一项工作. 其中,重点需要了解Geo ...
- BZOJ2154/BZOJ2693/Luogu1829 Crash的数字表格/JZPFAR 莫比乌斯反演
传送门--Luogu 传送门--BZOJ2154 BZOJ2693是权限题 其中JZPFAR是多组询问,Crash的数字表格是单组询问 先推式子(默认\(N \leq M\),所有分数下取整) \(\ ...
- Git .gitignore文件的使用
本文转载自 http://blog.csdn.net/xmyzlz/article/details/8592302 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .giti ...
- c# WPF 设置窗口一直在其中窗口后面/底层窗口
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- 腾讯云 ubuntu 上tomcat加载项目很慢
问题原因 随机数引起线程阻塞. tomcat不断启动,关闭, 启动关闭.几次后会出现卡死状况.需很久才能加载完成 阿里云同样配置,同样系统,则很难出现卡死状况. 即使出现过几十秒后也会释放出来. 而 ...
- iOS开发简记(2):自定义tabbar
tabbar是放在APP底部的控件.常见的APP都使用tabbar来进行功能分类的管理,比如微信.QQ等等. 小程需要一个特殊一点的tabbar,要求突显中间的那个按钮,让中间按钮特别显眼,从而引导用 ...
- C#_委托的使用
C#基础---委托的使用 一:什么是委托 委托是一种定义方法签名的类型当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联.您可以通过委托实例调用方法.委托是一个引用类型,所以它具 ...