UVa 11997 K Smallest Sums
2014-12-18 23:47
429 查看
题意分析:
有K个整数数组,各包含K个元素。在每个数组中取一个元素加起来,可以得到K^K个和。求这些和中最小的K个值(重复的值算多次)。其实这是一道多路合并的问题。可以先考虑两两合并。给出两个长度为n的有序表A和B,即数组。分别在A和B中任一个数相加,可以得到n^2个和。求这些和中最小的n个和。我们可以把这n^2和组织成如下n个有序表:表1: A1+B1<<A1+B2<<A1+B3<<.... 表2:A2+B1<<A2+B2<<A2+B3<<....经分析可知,这道题考察的是优先队列。
代码如下:
有K个整数数组,各包含K个元素。在每个数组中取一个元素加起来,可以得到K^K个和。求这些和中最小的K个值(重复的值算多次)。其实这是一道多路合并的问题。可以先考虑两两合并。给出两个长度为n的有序表A和B,即数组。分别在A和B中任一个数相加,可以得到n^2个和。求这些和中最小的n个和。我们可以把这n^2和组织成如下n个有序表:表1: A1+B1<<A1+B2<<A1+B3<<.... 表2:A2+B1<<A2+B2<<A2+B3<<....经分析可知,这道题考察的是优先队列。
代码如下:
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; struct node{ int sum,index; node(int sum,int index) :sum(sum) , index(index) { } bool operator < (const node& no) const { return sum>no.sum; } }; int a[100][100]; priority_queue<node> que; void merg(int* A,int* B,int* C,int n) { int i; for(i=0; i<n; i++) que.push(node(A[i]+B[0],0)); for(i=0; i<n; i++) { node no=que.top(); que.pop(); C[i] = no.sum; if(no.index+1<n) { que.push(node(no.sum-B[no.index]+B[no.index+1],no.index+1)); } } } int main() { int n,i,j; cin>>n; for(i=0; i<n; i++) for(j=0; j<n; j++) cin>>a[i][j]; sort(a[0],a[0]+n); for(i=1; i<n; i++){ merg(a[0],a[i],a[0],n); } cout<<a[0][0]; for(i=1; i<n; i++) cout<<' '<<a[0][i]; cout<<endl; return 0; }
相关文章推荐
- uva_11997,K Smallest Sums优先队列
- UVA-11997 K Smallest Sums
- UVA - 11997 K Smallest Sums
- K Smallest Sums(Uva 11997) 多路归并+优先队列
- UVa - 11997 - K Smallest Sums
- UVA11997 K Smallest Sums(并归,优先队列)
- UVA 11997 K Smallest Sums
- UVa-11997 K Smallest Sums 题解
- UVA - 11997 K Smallest Sums
- UVA 11997 K Smallest Sums(优先队列)
- UVa 11997 K Smallest Sums
- 【优先队列之多路合并】UVA - 11997 K Smallest Sums
- (UVa 11997)K Smallest Sums --多路归并问题,优先队列
- UVA 11997 - K Smallest Sums
- UVA 11997 K Smallest Sums——多路归并
- UVA11997_K_Smallest_Sums_多路并归_优先队列
- uva 11997 - K Smallest Sums
- (DS 《算法竞赛入门经典》)UVA 11997 K Smallest Sums
- Uva 11997 - K Smallest Sums(多路归并)
- UVA 11997 K Smallest Sums