poj 2442 Sequence
2016-08-08 20:10
351 查看
题目链接:点击打开链接
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
Sample Output
题目大意:有M行 每行有n个数,每行拿出一个数来相加得和,共有n的m次方个和,求前N个最小的和
基本思路:用优先队列存储 每输入一行就对其进行加和判断存储,注意删数队列;
具体看代码
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
题目大意:有M行 每行有n个数,每行拿出一个数来相加得和,共有n的m次方个和,求前N个最小的和
基本思路:用优先队列存储 每输入一行就对其进行加和判断存储,注意删数队列;
具体看代码
<span style="font-size:24px;">#include <iostream> #include<queue> #include<cstring> #include<algorithm> #include<cstdlib> #include<cstdio> using namespace std; int main() { int t; int n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); int x; priority_queue <int ,vector<int >,greater<int> >q;//从小到达存数 priority_queue <int ,vector<int >,less<int > >p;//从大到小存储 int a[2005]; for(int i = 0; i<n; i++) { scanf("%d",&x);//先将一行存入队列 q.push(x); } for(int i=1; i<m; i++) { for(int j=0; j<n; j++) { scanf("%d",&a[j]); } while(!q.empty())//将上一行的每个数拿出与当前行加和 { int sum=q.top(); q.pop(); for(int j=0;j<n;j++) { if(p.size()>=n&&p.top()>sum+a[j])//因为只要前n个数 所以只保留前n个最小的就行 { p.pop(); p.push(sum+a[j]); } else if(p.size()<n) { p.push(sum+a[j]); } } } while(!p.empty()) { q.push(p.top()); p.pop(); } } for(int i=0;i<n;i++) { if(i==0) { printf("%d",q.top()); q.pop(); } else { printf(" %d",q.top()); q.pop(); } } printf("\n"); } return 0; } </span>
相关文章推荐
- Sequence(POJ--2442
- poj 2442 Sequence
- POJ 2442 Sequence 优先队列
- Problem:POJ2442 - Sequence
- Problem:POJ2442 - Sequence
- poj 2442 Sequence
- POJ 2442 Sequence(优先队列)
- poj 2442 Sequence
- 【POJ 2442】Sequence
- poj 2442 Sequence(堆)
- POJ 2442 Sequence(堆的使用练习)
- POJ-2442 Sequence (K路归并问题拓展)
- poj 2442 Sequence(贪心,堆)
- POJ - 2442 Sequence
- poj 2442 Sequence
- POJ 2442 Sequence【堆】
- poj 2442 Sequence
- POJ 2442 Sequence
- poj 2442 Sequence(优先队列)