poj 2442 Sequence (Priority Queue)
真郁闷,明明方法是对的,为什么我的代码老是那么的慢。_(:з」∠)_
这题要想考虑两列的情况,然后逐列拓展。
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue> using namespace std; const int N = ;
const int Q = N * N;
template<class T>
struct PriQ {
T q[Q];
int sz;
void clear() { sz = ;}
void up(int k) {
while (k > ) {
if (q[k] < q[k >> ]) swap(q[k >> ], q[k]);
else return ;
k >>= ;
}
}
void push(T x) {
q[++sz] = x;
up(sz);
}
void down(int k) {
while ((k << ) <= sz) {
if ((k << ) == sz || q[k << ] < q[k << | ]) {
if (q[k << ] < q[k]) swap(q[k], q[k << ]);
else return ;
k = k << ;
} else {
if (q[k << | ] < q[k]) swap(q[k], q[k << | ]);
else return ;
k = k << | ;
}
}
}
void pop() {
q[] = q[sz];
sz--;
down();
}
T top() { return q[];}
int size() { return sz;}
} ;
PriQ<int> pq;
int ans[N];
//priority_queue<Node> pq; template<class T>
void priqcon(T *a, PriQ<T> &b, int sz) {
a[] = ;
for (int i = ; i <= sz; i++) {
a[++a[]] = b.top();
b.pop();
}
} int rec[N]; int main() {
int T, n, m, x;
scanf("%d", &T);
while (T-- && ~scanf("%d%d", &n, &m)) {
ans[] = ;
ans[] = ;
int mx;
for (int i = ; i < n; i++) {
pq.clear();
mx = ;
for (int j = ; j < m; j++) scanf("%d", &rec[j]);
sort(rec, rec + m);
for (int j = ; j < m; j++) {
x = rec[j];
for (int k = ; k <= ans[]; k++) {
if (pq.sz < m || ans[k] + x < mx) {
pq.push(ans[k] + x);
mx = max(mx, ans[k] + x);
}
}
}
priqcon(ans, pq, m);
}
for (int i = ; i < m; i++) {
if (i) putchar(' ');
printf("%d", ans[i + ]);
}
puts("");
}
return ;
}
好了,其实做这题并不是我的原意,实际上是为了测试二叉堆有没写错的。
——written by Lyon
poj 2442 Sequence (Priority Queue)的更多相关文章
- POJ 2442 Sequence(堆的使用练习)
题目地址:id=2442">POJ 2442 真心没想到这题的思路. .原来是从第一行逐步向下加,每次都仅仅保存前n小的数.顺便练习了下堆.. 只是感觉堆的这样的使用方法用的不太多啊. ...
- POJ 2442 - Sequence - [小顶堆][优先队列]
题目链接:http://poj.org/problem?id=2442 Time Limit: 6000MS Memory Limit: 65536K Description Given m sequ ...
- POJ 2442 Sequence
Pro. 1 给定k个有序表,取其中前n小的数字.组成一个新表,求该表? 算法: 由于 a1[1] < a1[2] < a1[3] ... <a1[n] a2[1] < a2 ...
- poj 2442 Sequence(优先队列)
题目:http://poj.org/problem?id=2442 题意:给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列, 让你求出序列和最小的前n个序列的序列和 ...
- POJ 2442 Sequence 优先队列
题目: http://poj.org/problem?id=2442 #include <stdio.h> #include <string.h> #include <q ...
- POJ 2442 Sequence【堆】
题目链接:http://poj.org/problem?id=2442 题目大意:给出一个m*n的矩阵,从每一行中取出一个数相加.能得到n^m个不同的结果.要求输出当中前n项. 建立一个以n元数组为底 ...
- POJ 2442 Sequence堆 优先队列
题目描述 给定m个序列,每个序列包含n个非负整数.现在我们可以从每个序列中选择一个数字以形成一个具有m个整数的序列.显然,我们可以得到n ^ m种这种序列.然后,我们可以计算每个序列中的数字总和,并获 ...
- Sequence POJ - 2442
Sequence POJ - 2442 口胡一个结论:就是前i行产生的最小的n个和,一定可以在"前i-1行产生的最小n个和,每一个加上这一行的任意一个数,产生的n2个数"中找到.( ...
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅰ
许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者是不一定要以此就将他们排序.很多情况下我们会手机一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素.如此这 ...
随机推荐
- 常见任务&基本工具 1 软件包管理
打包系统主要有两个阵营 包文件的简介 Package files are created by a person known as a package maintainer, often (but n ...
- jsp必填项加红色星号
<th><font color=red>*</font>文字:</th>
- 洛谷P1979 [NOIP2013提高组Day2T3]华容道
P1979 华容道 题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少 ...
- Vue--过渡动画实现的三种方式
一.使用vue的transition标签结合css样式完成动画 <!DOCTYPE html> <html lang="en"> <head> ...
- DataGrid无故多一行空白行
DataGrid绑定datatable时, Datagrid.Itemsource=dt.DefaultView: 发现DataGRID会多处一行 解决如下: 对Datagrid的CanUserAdd ...
- Vue. 之 npm安装Element
Vue. 之 npm安装Element 前提: 相关运行环境以搭建完成,例如:Node.Npm等. 假如我的项目目录如下: D:\DISK WORKSPACE\VSCODE\CDS\cds-ap ...
- BZOJ 3057圣主的考验题解
老师居然考这么毒瘤的题目!!!!! 很容易想到dp,f[i][j]表示有i个节点,左子树的最深深度为j的方案数 枚举左子树有多少节点然后转移,复杂度为n^3 T飞~ 我们考虑到有深度为h的树的节点有多 ...
- 如何解决IntelliJ在打包Maven项目时不打包配置文件
在pom文件中加上你的配置文件夹目录: <build> <resources> <resource> <directory>src/res</di ...
- ie6中兼容性问题总结
针对firefox ie6 ie7 ie8的css样式中的line-height属性,以前我们大部分都是用!important来hack,对于ie6和firefox测试可以正常显示,但是ie7以上对! ...
- PHP学习(运算符)
PHP运算符一般分为算术运算符.赋值运算符.比较运算符.三元运算符.逻辑运算符.字符串连接运算符.错误控制运算符. 算术运算符 主要是用于进行算术运算的,例如:加法运算.减法运算.乘法运算.除法运算 ...