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

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(int i = (x);i <= (y);i++)
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 919;
int lenx, leny, K;
//int map[maxn][maxn];
int a[maxn], b[maxn];
int temp[maxn];
struct Node{
int val, i, j;
bool operator < (const Node &a)const{
return val < a.val;
}
};
int main(){
lenx = RD(), leny = RD(), K = RD();
REP(i, 1, leny)a[i] = RD();
sort(a + 1, a + 1 + leny);//处理第一行
REP(t, 2, lenx){
priority_queue<Node>Q;
REP(i, 1, leny)b[i] = RD();
sort(b + 1, b + 1 + leny);//读入新一行
REP(i, 1, K)Q.push((Node){-(a[i] + b[1]), i, 1});
int i = 0;
while(++i <= K){
Node top = Q.top();Q.pop();
temp[i] = -(top.val);
Q.push((Node){-(a[top.i] + b[top.j + 1]), top.i, top.j + 1});
}
REP(i, 1, K)a[i] = temp[i];
}
REP(i, 1, K)printf("%d ", a[i]);
puts("");
return 0;
}

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. 第十周psp作业

    本周psp 本周进度条 代码累积折线图 博文字数累积折线图 饼状图

  2. Notes of Daily Scrum Meeting(11.11)

    Notes of Daily Scrum Meeting(11.11) 今天是11月11号光棍节,不知道大家的购物热情被点燃没有,有没有买到自己心仪的东西.额,今天我们的团队任务进度和昨天差不多, 每 ...

  3. 20162319 实验二 Java面对对象程序设计 实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  4. python处理xml实例

    """ Author = zyh FileName = read_xml_1.py Time = 18-9-26 下午5:19 """ fr ...

  5. 浅谈对IT的认识!

    我是一个从农村出来的学生,家里的情况和大多数的农村同学是一样的,家里算不上有钱,父母供我读书,也已经是做到仁至义尽了. 我现在选了,一个和计算机有关的专业---计算机应用技术.就是希望毕业后,可以找到 ...

  6. 【动态规划】POJ-2229

    一.题目 Description Farmer John commanded his cows to search for different sets of numbers that sum to ...

  7. 构建基于Chromium的应用程序(Winform程序加载Html页面)

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...

  8. Jenkins权限控制-Role Strategy Plugin插件使用

    Role Strategy Plugin插件可以对构建的项目进行授权管理,让不同的用户管理不同的项目,将测试和生产环境分开. 具体配置方法如下(操作需要管理员用户权限). Jenkins版本:1.64 ...

  9. jsp页面has already been called for this response错误解决方法。

    创建验证码的jsp页面提示错误:has already been called for this response <%@ page contentType="image/jpeg&q ...

  10. mysql数据优化--数据库结构的优化

    1,比如存时间类型的就使用int类型   其中mysql的两个函数可以拿来使用 unix_timestamp 将时间日期转化为时间戳