標籤:des style blog http color os strong io
F - Sequence
Time Limit:6000MS
Memory Limit:65536KB
64bit IO Format:%I64d & %I64uSubmit Status
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
12 31 2 32 2 3
Sample Output
3 3 4
感謝http://www.cnblogs.com/372465774y/archive/2012/07/09/2583866.html
做這個題首先思考兩個問題
由這兩個得出,要求n個數組每個數組m個值,數組1和數組2的和找出最小的m個,再用來和數組3求和,找到最小的m個,最終得到所有的數組中的最小的m個
由於每個數組都是有序的,而且我們要求的最小的m個,數組a[i][j]+隊列中的值 > 隊首的值,那麼a[i][j]加上隊列中以後的值都會大於隊首,對於我們要求解的最小的m個值無意義。隊列中儲存了當前數組到之前所有數組的最小的m個和,不斷更新隊列
#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;int a[110][2100] , b[2100] ;priority_queue <int> p ;int main(){ int i , j , k , n , m , t ; scanf("%d", &t); while(t--) { scanf("%d %d", &n, &m); for(i = 0 ; i < n ; i++) { for(j = 0 ; j < m ; j++) scanf("%d", &a[i][j]); sort(a[i],a[i]+m); } for(i = 0 ; i < m ; i++) p.push(a[0][i]) ; for(i = 1 ; i < n ; i++) { for(j = 0 ; j < m ; j++) { b[j] = p.top(); p.pop(); } for(j = 0 ; j < m ; j++) { for(k = m-1 ; k >= 0 ; k--) { if(j == 0) p.push( a[i][j]+b[k] ); else { if( a[i][j] + b[k] < p.top() ) { p.pop(); p.push(a[i][j]+b[k]); } else break; } } } } for(j = 0 ; j < m ; j++) { b[j] = p.top(); p.pop(); } for(j = m-1 ; j >= 0 ; j--) { if(j == 0) printf("%d\n", b[j]); else printf("%d ", b[j]); } } return 0;}