题面

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

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

弱化版

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

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. C++ 函数模板&类模板

    函数模板 #include <iostream> #include <string> using namespace std; template <typename T& ...

  2. Android多线程—HandlerThread解析

    一.HandlerThread作用 1.实现多线程:在工作线程之后执行任务(比如一些耗时任务) 2.异步通信.消息传递:实现工作线程与主线程(UI线程)之间的通信,即将工作线程的执行结果传递给主线程, ...

  3. C语言程序设计II—第四周教学

    第四周教学总结(18/3-24/3) 教学内容 本周的教学内容为:第七章 数组 7.2 二维数组 课前准备 在博客园发布作业:2019春第四周作业 第三周作业讲解视频:A Programing Vid ...

  4. kubespray -- k8s集群dashboard 访问方式

    1.参考这篇文章: https://github.com/kubernetes/dashboard/wiki/Creating-sample-user 创建用户 2.获取token 3.kubectl ...

  5. coredns CrashLoopBackOff 报错

    1.kubectl logs -f coredns-99b9bb8bd-47mvf -n kube-system .:53 2018/09/22 07:39:37 [INFO] CoreDNS-1.2 ...

  6. Java实现几种常见排序方法

    日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 以下常见算法的定义 1. 插入排序:插入排序基本操作就是将一 ...

  7. proxy config (firefox config)

    sudo apt-get install shadowsocks sudo apt-get install polipo 编辑polipo config: sudo vim /etc/polipo/c ...

  8. Identity(五)

    本文摘自 ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇 在这篇文章中,我将继续ASP.NET Identity 之旅,这也是ASP.NET Ide ...

  9. WPF Blend 脑洞大开的问题:如何用Blend得到或画出一个凹槽、曲面。

    原文:WPF Blend 脑洞大开的问题:如何用Blend得到或画出一个凹槽.曲面. 目标图: 步骤一(放置一个矩形,填充蓝色): 步骤二(复制该矩形,并调整边角,填充粉红色): 第三部:让图形部分重 ...

  10. odoo11 访问web/database/manager管理数据库页面布局混乱问题

    最近在使用odoo11开发自己的模块时,在管理数据库的页面的时候,页面布局混乱,查看http加载页面的时候大量的js css文件没有加载成功,被卡了3天,现在问题找到. 问题是在加入自己的custom ...