P1392 取数

题目描述

在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和。对于给定的数阵,请你输出和前k小的取数方法。

说明

对于20%的数据,n≤8

对于100%的数据,n≤800,k≤m≤800

Solution

先看一下当 \(n == 2\) 时的序列合并

类似的,我们先把第一行和第二行合并, 记为序列 \(temp[\ ]\)

因为每次丢进堆中的都是 \(a[x] + b[y]\)

所以最终会得到的 \(temp[\ ]\) 序列为 有序的序列且每个元素都形如\(a[x] + b[y]\)

如此, 我们在将此序列和下一个序列 \(c\) 合并

可以得到一个有序序列

此序列有序且每个元素都形如 \(temp[x] + c[y]\) 即 \(a[x] +b[y] + c[z]\)

故我们将序列合并 \(n - 1\) 次, 每次取新序列前 \(K\) 项, 最后大融合的序列即为答案

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<climits>
  7. #define LL long long
  8. #define REP(i, x, y) for(int i = (x);i <= (y);i++)
  9. using namespace std;
  10. int RD(){
  11. int out = 0,flag = 1;char c = getchar();
  12. while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
  13. while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
  14. return flag * out;
  15. }
  16. const int maxn = 919;
  17. int lenx, leny, K;
  18. //int map[maxn][maxn];
  19. int a[maxn], b[maxn];
  20. int temp[maxn];
  21. struct Node{
  22. int val, i, j;
  23. bool operator < (const Node &a)const{
  24. return val < a.val;
  25. }
  26. };
  27. int main(){
  28. lenx = RD(), leny = RD(), K = RD();
  29. REP(i, 1, leny)a[i] = RD();
  30. sort(a + 1, a + 1 + leny);//处理第一行
  31. REP(t, 2, lenx){
  32. priority_queue<Node>Q;
  33. REP(i, 1, leny)b[i] = RD();
  34. sort(b + 1, b + 1 + leny);//读入新一行
  35. REP(i, 1, K)Q.push((Node){-(a[i] + b[1]), i, 1});
  36. int i = 0;
  37. while(++i <= K){
  38. Node top = Q.top();Q.pop();
  39. temp[i] = -(top.val);
  40. Q.push((Node){-(a[top.i] + b[top.j + 1]), top.i, top.j + 1});
  41. }
  42. REP(i, 1, K)a[i] = temp[i];
  43. }
  44. REP(i, 1, K)printf("%d ", a[i]);
  45. puts("");
  46. return 0;
  47. }

P1392 取数的更多相关文章

  1. 2021.11.04 P1392 取数(多路归并)

    2021.11.04 P1392 取数(多路归并) P1392 取数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 在一个n行m列的数阵中,你须在每一行取一个数(共n个数) ...

  2. 洛谷P1392 取数 [堆]

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

  3. P1392 取数[堆]

    题目描述 在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和.对于给定的数阵,请你输出和前k小的取数方法. 解析 写这题完全自闭. 根本没联想起远古时期做的 P1631 ...

  4. 洛谷 P1392 取数

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

  5. [洛谷P1392] 取数

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

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

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

  7. NOIP2007 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  8. NOIP2007矩阵取数[DP|高精度]

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  9. Vijos1451圆环取数[环形DP|区间DP]

    背景 小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主…… 描述 守护者拿出被划分为n个格子的一个圆环,每个 ...

随机推荐

  1. Promise.all请求失败重发功能的实现

    写爬虫时遇到用Promise.all同时请求多个页面,不可避免的会遇到某些请求失败的情况,这时可以实现一个"重发失败请求"的功能. Promise.all(task).then() ...

  2. java的内存管理机制

    1.内存区域的分类 栈内存:基本类型变量和对象的引用,优势在于存取速度快 堆内存:new创建的对象和数组以及对象的实例化变量,优势在于动态分配内存,但是存取速度相对较慢 2.不同类型的内存分配 (1) ...

  3. Scrum Meeting 10.27

    1.会议内容: 姓名 今日任务 明日任务 预估时间(h) 徐越 配置SQLserver 学习本地和服务器之间的通信 4 卞忠昊 找上届代码的bug 学习安卓布局(layout)的有关知识,研究上届学长 ...

  4. 20172319 2018.03.27-04.05 《Java程序设计》第4周学习总结

    20172319 2018.03.27-04.05 <Java程序设计>第4周学习总结 教材学习内容总结 第四章 编写类 类与对象的回顾:对象是有状态的,状态由对象的属性值确定.属性由类中 ...

  5. 进阶系列(4)—— C#文件与流

    一. 驱动器 在Windows操作系统中,存储介质统称为驱动器,硬盘由于可以划分为多个区域,每一个区域称为一个驱动器..NET Framew   ork提供DriveInfo类和 DriveType枚 ...

  6. Leetcode题库——23.合并k个排序链表

    @author: ZZQ @software: PyCharm @file: mergeKLists.py @time: 2018/10/12 19:55 说明:合并 k 个排序链表,返回合并后的排序 ...

  7. css布局 弹性布局 和 网格布局

    这里就不写这两种布局的内容了 弹性布局链接:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 网格布局链接:https://www.ji ...

  8. Mysql Group Replication 简介及单主模式组复制配置【转】

    一 Mysql Group Replication简介    Mysql Group Replication(MGR)是一个全新的高可用和高扩张的MySQL集群服务.    高一致性,基于原生复制及p ...

  9. Js获取上一月份

    new Date(new Date().setMonth(new Date().getMonth() - 1))

  10. [转帖] CentOS7 与 CentOS6的对比

    来源网站: http://blog.51cto.com/fengery/1901349 centos6.x_centos7.x差异改进明细 感谢原作者 centos官方帮助文档:https://wik ...