您的位置:首页 > 产品设计 > UI/UE

POJ 2442Sequence

2016-11-22 20:35 387 查看

Sequence

Time Limit: 6000MSMemory Limit: 65536K
Total Submissions: 9144Accepted: 3046
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

Source
题意:给n行m列,从每行中选出一个数字,n个数字的和sum,有n的m次方个sum,对sum升序,输出前n个sum。
题解:用到优先队列。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <queue>

using namespace std;

int main()
{
int K;
int i, j, k, n, m;
int a[2010], b[2010];
scanf("%d", &K);
while(K--)
{
cin>>n>>m;
for(i = 0; i < m; i++)
{
scanf("%d", &a[i]);
}
sort(a, a + m);//对第一行升序。
for(i = 1; i < n; i++)
{
priority_queue<int, vector<int>, less<int> >q;//大的靠近队列的头。
for(j = 0; j < m; j++)
{
scanf("%d", &b[j]);
}
for(j = 0; j < m; j++)//将a中的最小值和b相加,确定临时的最小sum队列
{
q.push(a[0] + b[j]);
}
for(j = 1; j < m; j++)//挨个比较选出a和b中最小的n个sum。
{
for(k = 0; k < m; k++)
{
if(a[j] + b[k] < q.top())
{
q.pop();
q.push(a[j] + b[k]);
}
}
}
for(j = 0; j < m; j++)//把最小的n个sum赋值给a,下个循环再用。
{
a[j] = q.top();
q.pop();
}
sort(a, a + m);
}
for(i = 0; i < m; i++)
{
if(i == m - 1)
printf("%d\n", a[i]);
else
printf("%d ", a[i]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: