POJ 2442 Sequence
2016-10-26 22:56
344 查看
题目大意: 有m个序列,每个序列有n个数,从每个数列中取出一个数构成一个有m个元素的序列(共有n^m种)., 求这n^m种可能中从小到大输出的前n个sum.(sum指每种情况下各自元素总和)
解题思路:先求前k行的前n个最小sum(利用优先队列进行维护),再求第k+1行,以此类推,求出m个序列前n个最小sum.
解题思路:先求前k行的前n个最小sum(利用优先队列进行维护),再求第k+1行,以此类推,求出m个序列前n个最小sum.
<span style="font-size:14px;">#include<iostream> #include<algorithm> #include<cstring> #include<queue> #include<cstdio> using namespace std; priority_queue<int>que;//最大堆优先队列 int a[1005][2005]; int sum[2005]; int main() { int T; scanf("%d", &T); while(T--) { int i, j,k, m, n; scanf("%d%d", &m, &n); memset(a,0, sizeof(a)); memset(sum, 0, sizeof(sum)); for(i=1; i<=m; i++) { for(j=1; j<=n; j++) { scanf("%d", &a[i][j]); } } for(i=1; i<=n; i++) que.push(a[1][i]);//将第一行的元素入队 for(i=2; i<=m; i++) { sort(a[i]+1, a[i]+n+1);//排队后 从小到大 //sum数组储存 以便后边的比较 for(j=1; j<=n; j++) { sum[j]=que.top(); que.pop(); } //取第i行的第一个元素与前i-1行所取出的前n个最小sum相加 for(j=1; j<=n; j++) { que.push(a[i][1]+sum[j]); } // 先确定1 2行的前n个最小sum 然后再确定1 2 3行的前n个最小sum 以此类推. for(j=2; j<=n; j++) { for(k=n; k>=1; k--) { if(a[i][j]+sum[k]<que.top())//进行比较, 始终维护堆的前n个 { que.pop(); que.push(a[i][j]+sum[k]); } else break; } } } for(i=1; i<=n; i++) { sum[i]=que.top(); que.pop(); } for(i=n; i>=1; i--) { if(i!=n) printf(" "); printf("%d",sum[i]); if(i==1) printf("\n"); } } return 0; }</span>
相关文章推荐
- POJ 2442 Sequence (堆)
- Poj 2442 Sequence
- poj2442 Sequence----堆复习
- POJ2442 Sequence【k小堆问题】
- POJ 2442 Sequence(stl+优先队列||堆)
- POJ 2442 Sequence (堆)
- POJ 2442 Sequence(堆)
- poj 2442 Sequence
- poj 2442 Sequence 堆
- POJ 2442 Sequence 优先队列
- POJ-2442-Sequence
- Problem:POJ2442 - Sequence
- POJ 2442 Sequence
- POJ 2442 Sequence
- Problem:POJ2442 - Sequence
- POJ2442——Sequence
- POJ 2442 Sequence【堆】
- POJ 2442-Sequence(优先队列-m组n个数每组取一个求n个最小值)
- poj-2442-Sequence-优先队列||堆