现在的位置: 首页 > 综合 > 正文

poj2442 Sequence

2014年09月05日 ⁄ 综合 ⁄ 共 1572字 ⁄ 字号 评论关闭

题意:给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列,让你求出序列和最小的前n个序列的序列和;

我一开始的做法是用数组进行模拟这个堆的过程,但是由于每次排序函数的时间都很多,所以超时了啊、

后来看了一下题解用优先队列做的,这样判断一下如果大于队首元素就不如队列,可以省去很多的时间、、

Sequence
Time Limit: 6000MS   Memory Limit: 65536K
Total Submissions: 6246   Accepted: 1945

Description

Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's clear that we may get n ^ m this kind of sequences. Then we can calculate the sum of numbers in each sequence,
and get n ^ m values. What we need is the smallest n sums. Could you help us?

Input

The first line is an integer T, which shows the number of test cases, and then T test cases follow. The first line of each case contains two integers m, n (0 < m <= 100, 0 < n <= 2000). The following m lines indicate the m sequence respectively. No integer
in the sequence is greater than 10000.

Output

For each test case, print a line with the smallest n sums in increasing order, which is separated by a space.

Sample Input

1
2 3
1 2 3
2 2 3

Sample Output

3 3 4
#include <stdio.h>
#include <string.h>
#include <queue>
#include <iostream>
#include <stdlib.h>

using namespace std;

int a[40005];
int main()
{
    int t, n, m, i, j, flat, sum;
    scanf("%d",&t);
    while(t--)
    {
        int x;
        scanf("%d %d",&n, &m);
        priority_queue<int , vector<int> , greater<int> >p;
        priority_queue<int , vector<int> , less<int> >q;
        for(i = 0; i < m; i++)
        {
            scanf("%d",&x);
            p.push(x);
        }
        for(i = 1; i < n; i++)
        {
            for(j = 0; j < m; j++)
                scanf("%d",&a[j]);
            while(!p.empty())
            {
                sum = p.top();
                p.pop();
                for(j = 0; j < m; j++)
                    if(q.size() < m)
                        q.push(sum+a[j]);
                    else if(q.size() == m && q.top() > sum+a[j])
                    {
                        q.pop();
                        q.push(sum+a[j]);
                    }
            }
            while(!q.empty())
            {
                p.push(q.top());
                q.pop();
            }
        }
        flat = 0;
        for(i = 0; i < m; i++)
        {
            if(flat)
                printf(" ");
            printf("%d",p.top());
            p.pop();
            flat = 1;
        }
        printf("\n");
    }
    return 0;
}

抱歉!评论已关闭.