【POJ 2442】 Sequence

【题目链接】

http://poj.org/problem?id=2442

【算法】

【代码】

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>
using namespace std;
#define MAXM 110
#define MAXN 2010

int T,n,m,i,j;
int a[MAXM][MAXN],ans[MAXN];

struct info
{
        int p,q,val;
        bool last;
        friend bool operator < (info a,info b)
        {
                return a.val > b.val;
        }
} ;

inline void _merge(int *a,int *b)
{
        int i,j;
        priority_queue< info > q;
        static int res[MAXN];
        info tmp;
        while (!q.empty()) q.pop();
        q.push((info){1,1,a[1]+b[1],false});
        for (i = 1; i <= n; i++)
        {
                tmp = q.top();
                q.pop();
                res[i] = tmp.val;
                q.push((info){tmp.p,tmp.q+1,a[tmp.p]+b[tmp.q+1],true});
                if (!tmp.last) q.push((info){tmp.p+1,tmp.q,a[tmp.p+1]+b[tmp.q],false});
        }
        for (i = 1; i <= n; i++) a[i] = res[i];
}

int main()
{

        scanf("%d",&T);
        while (T--)
        {
                scanf("%d%d",&m,&n);
                for (i = 1; i <= m; i++)
                {
                        for (j = 1; j <= n; j++) scanf("%d",&a[i][j]);
                        sort(a[i]+1,a[i]+n+1);
                }
                for (i = 1; i <= n; i++) ans[i] = a[1][i];
                for (i = 2; i <= m; i++) _merge(ans,a[i]);
                for (i = 1; i < n; i++) printf("%d ",ans[i]);
                printf("%d\n",ans[n]);
        }

        return 0;

}

原文地址:https://www.cnblogs.com/evenbao/p/9251237.html

时间: 2024-10-09 23:24:20

【POJ 2442】 Sequence的相关文章

【POJ 2442】Sequence

[POJ 2442]Sequence 优先队列 m个序列 每个序列n个数 从每个序列中取一个数 可以组成一个长为m的序列 这样一共有n^m种组法 把所有组合的加和排序后输出前n小的和 乍一看听高深的一个问题 其实想清楚了很简单 每一组中取一个数相加 第一组可以有n种取法 假设当前只有两组 按题意组合就是将第一组中n个数分别与第二组n个数相加 取出前n小的和 那么现在再来一组 前两组一共有n*n种组合 每种组合与第三组中n个数再组合 前n小的和就是结果 这三组一共有n^3种组合 然而答案只需要前n

【POJ 1019】 Number Sequence

[POJ 1019] Number Sequence 二分水题 放组合数学里...可能有什么正规姿势吧Orz 112123123412345...这种串 分成长度1 2 3 4 5...的串 注意有多位数 把长度累加到一个数组里 注意要累加 因为查询的时候查的是原串中对应位置的数 因此要累加上前一次的长度 然后二分处该串前的总长 用查询的位置-之前串的总长 就是在最长的串中的位置 因此还要打个最长串的表 这些我都写一个循环里了 看着有点乱 可以拆开写... 代码如下: #include <ios

【POJ 1094】Sorting It All Out

[POJ 1094]Sorting It All Out 拓扑排序 输出第一次成功排序的位置及顺序(能顺利拓扑并在拓扑中不存在同级) 或者 第一个出现与之前给出条件相悖的位置(拓扑过程中出现间断) 坑点是出现任何一种情况就out 代码如下 #include <iostream> using namespace std; int in[26],inn[26],n; int mp[26][26]; int Topo(int op) { int i,j,k,f = 1; for(i = 0; i &

【POJ 3368】 Frequent values(RMQ)

[POJ 3368] Frequent values(RMQ) Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15813   Accepted: 5749 Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given seve

【POJ 2409】 Let it Bead(Polya)

[POJ 2409] Let it Bead(Polya) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5378   Accepted: 3596 Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you can deduce from the company name, t

【POJ 3070】Fibonacci(矩阵快速幂)

[POJ 3070]Fibonacci(矩阵快速幂) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12333   Accepted: 8752 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 + Fn ? 2 for n ≥ 2. For example, the first ten terms of the

【POJ 1408】 Fishnet (叉积求面积)

[POJ 1408] Fishnet (叉积求面积) 一个1*1㎡的池塘 有2*n条线代表渔网 问这些网中围出来的最大面积 一个有效面积是相邻两行和相邻两列中间夹的四边形 Input为n 后面跟着四行 每行n个浮点数 每一行分别代表a,b,c,d 如图 并且保证a(i) > a(i-1) b(i) > b(i-1) c(i) > c(i-1) d(i) > d(i-1) n(n <= 30)*2+4(四个岸)条边 枚举点数就行 相邻的四个四个点枚举 找出围出的最大面积 找点用

【POJ 2513】Colored Sticks

[POJ 2513]Colored Sticks 并查集+字典树+欧拉通路 第一次做这么混的题..太混了-- 不过题不算难 字典树用来查字符串对应图中的点 每个单词做一个点(包括重复单词 题意就是每个边走且直走一次(欧拉通路 欧拉图的判定: 没有或者只有两个奇数度的点的图叫做欧拉图 有这些就可以解答此题了 另外需要注意题目范围是25W个木棍 所以最多可能有50W个点 卡了好多个RE 代码如下: #include <iostream> #include <cstdlib> #incl

2292: 【POJ Challenge 】永远挑战

2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 230[Submit][Status][Discuss] Description lqp18_31和1tthinking经常出题来虐ftiasch.有一天, lqp18_31搞了一个有向图,每条边的长度都是1. 他想让ftiasch求出点1到点 N 的最短路."水题啊.", ftiasch这么说道. 所以1tth