[洛谷P1392] 取数
无法用复杂状态进行转移时改变计算方式;巧妙的整体考虑;压缩空间优化时间
传送门:$>here<$
题意
给出一个n*m矩阵,从每一行选一个数加起来,可以得到一个和。易知总共会有$n^n$个和,输出最小的k个。
数据范围:$n,m \leq 800,k \leq m$
Solution
问题的转化
序列合并问题是这道题的弱化版——也就是在这道题目里规定n=2。这样的问题做法是先分别排序,然后默认a[1]与b[1..n]相加得到的n个和为最小,然后分别用其他的和去更新。由于单调性,a[i]一旦不能满足就立即跳出,可以证明复杂度接近$O(nlog^2n)$
这道题变成了n行,而我们可以将其转化为两行的问题——将前n-1行看做一个子问题。由于保证了k<=m,因此每做完一次就将若干行合并为一行,反复迭代即可。
启示
问题的转化
利用所要求的条件转化问题。尤其是这种非常类似的。
my code
第一行要特判
/*By DennyQi 2019*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
;
const int INF = 0x3f3f3f3f;
inline int Max(const int a, const int b){ return (a > b) ? a : b; }
inline int Min(const int a, const int b){ return (a < b) ? a : b; }
inline int read(){
; ; register char c = getchar();
'); c = getchar());
, c = getchar();
) + (x<<) + c - '; return x * w;
}
int n,m,K;
int a[MAXN],b[MAXN],c[MAXN];
priority_queue <int, vector<int>, less<int> > H;
inline void Merge(){
while(H.size()) H.pop();
; i <= m; ++i){
H.push(a[] + b[i]);
}
; i <= m; ++i){
; j <= m; ++j){
if(a[i]+b[j] < H.top()){
H.pop();
H.push(a[i]+b[j]);
}
else{
break;
}
}
}
; --i){
c[i] = H.top();
H.pop();
}
}
int main(){
n = read(), m = read(), K = read();
; i <= n; ++i){
; j <= m; ++j){
a[j] = read();
}
sort(a+,a+m+);
){
; j <= m; ++j){
b[j] = a[j];
}
continue;
}
Merge();
; j <= m; ++j){
b[j] = c[j];
}
}
; i <= K; ++i){
printf("%d ",b[i]);
}
;
}
[洛谷P1392] 取数的更多相关文章
- 洛谷 P1392 取数
题面 在做这道题前,先要会他的弱化版(实际一模一样,只是愚蠢的洛谷评测级别差了一档(睿智如姬无夜)) ----------------------------------弱化版------------ ...
- 洛谷P1392 取数 [堆]
题目传送门 取数 题目描述 在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和.对于给定的数阵,请你输出和前k小的取数方法. 输入输出格式 输入格式: 第一行,三个数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\) ,那么你肯定走另一边. 那么你走另一边绝对不能让这条边有剩余,因为这条边有剩余的 ...
随机推荐
- 如何使用git和ssh部署本地代码到服务器
一.首先设置好自己本地的Git用户名和密码: git config --global user.name "your name" git config --global user. ...
- js 获取上传视频的时长、大小、后缀名
参考资料:获取时长 var fileName = $("#sectionfileUpload").val(); //C:\fakepath\3.jpeg var exts = fi ...
- 客户端浏览器- UWP兼容版本WebView
WebView简介 在win10之前,浏览器控件有WPF版本webBrowser.Winform版本WebBrowser,浏览器内核为IE. win10之后,微软不再维护原有的WebBrowser,转 ...
- thinkphp5路由心得
路由的作用:1. 简化URL地址,方便大家记忆2. 有利于搜索引擎的优化,比如可以被百度的爬虫抓取到 优化URl1. 前后端分离修改入口文件,在public下新建admin.php文件,将下面的代码添 ...
- Android为TV端助力 listview与recyclerview上下联动
首先是主布局fragment里面的xml文件 <?xml version="1.0" encoding="utf-8"?><RelativeL ...
- WordCount结对编程
合作者:201631062602,201631062114 代码地址:https://gitee.com/Changyu-Guo/pairing_project 作业链接:https://www.cn ...
- 配置MySQL的数据源
首先查看自己是否有这个驱动 有就进行以下操作,没有那就找下载 安装mysql-for-visualstudio 1)双击 mysql-for-visualstudio-2.0.5.msi 2)点击 ...
- ASP.NET Zero--基于令牌的认证&SWAGGER UI
基于令牌的认证 任何应用程序都可以将应用程序中的任何功能认证和使用为API.例如,您可以创建一个移动应用程序消耗相同的API.在本节中,我们将演示来自Postman的API (Google Chrom ...
- C#-反射reflection
目录 简介 引入 1.新建类库 2. 类库的使用 3.反射 反射实例1 反射实例2 反射实例3 C# shanzm 简介 反射(reflection)是什么? 在<精通C#>中是这么说的& ...
- nginx地址代理(2)
本章要讲的是服务器的代理: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器, 一对一代理:就一个服务器监听 server { listen ...