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)-Ⅰ
许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者是不一定要以此就将他们排序.很多情况下我们会手机一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素.如此这 ...
随机推荐
- oracle -视图 序列 约束
1.视图 视图是基于一个或者多个表数据库对象,视图允许用户创建一个无数据的”伪表“,视图只是一个获取特定列好行的sql查询组成,通过视图检索数据就像从表中检索数据 一样. 视图可以提供一个附加的安全层 ...
- 由一道面试题引起的arguments的思考
写一个按照下面方式调用都能正常工作的 sum 方法 console.log(sum(2,3)); // Outputs 5 console.log(sum(2)(3)); // Outputs 5从这 ...
- BootstrapValidator实现注册校验和登录错误提示效果(转)
使用BootstrapValidator进行注册校验和登录错误提示,具体内容如下 1.介绍 在AdminEAP框架中,使用了BootstrapValidator校验框架,本文以注册校验的用户名.登录名 ...
- onethink二级导航调用
<ul class="nav-main">//添加tree参数 <think:nav name="nav" tree="true&q ...
- JavaScript--放大镜
上例图: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...
- Directx11教程(6) 画一个简单的三角形(2)
原文:Directx11教程(6) 画一个简单的三角形(2) 在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变, ...
- java 操作Oracle 批量入库的问题
java 操作Oracle 批量入库的问题 先说下我运行的环境: Windows7 64位操作系统 (四核)Intel i5-2300 CPU @2.80GHz 内存4G 硬盘1T Jdk1.6+My ...
- HZOJ 导弹袭击
比较显然的一个性质是如果存在$a(i)>=a(j) \& \& b(i)>=b(j)$那么j没用. 我们并不需要A,B的具体取值,我们之关心$\frac {A}{B}$. ...
- centos安装php7.18注意
报错–php53-common conflicts with php-common //解决 yum -y install php* --skip-broken 第一步:安装源 yum install ...
- git操作——TortoiseGit指定某个分支clone
需求 需要使用TortoiseGit 克隆某个项目分支 操作 勾选分支,输入分支名称clone代码即可