UVA 11997 K Smallest Sums
2015-08-18 20:13
344 查看
题目链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3148
题意:给定k个数组,每个数组k个数字,要求每个数字选出一个数字,构成和,这样一共有kk种情况,要求输出最小的k个和
其实只要能求出2组的前k个值,然后不断两两合并就可以了
代码:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3148
题意:给定k个数组,每个数组k个数字,要求每个数字选出一个数字,构成和,这样一共有kk种情况,要求输出最小的k个和
其实只要能求出2组的前k个值,然后不断两两合并就可以了
代码:
[code]#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> #include <stack> #include <vector> using namespace std; struct Item { int s, b; Item(int s, int b) :s(s), b(b) {} bool operator < (const Item& rhs) const { return s > rhs.s; } }; const int MAXN = 1100; int a[MAXN][MAXN]; int b[MAXN]; void merge(int* A, int* B, int* C, int n) { priority_queue<Item> q; for (int i = 0; i < n; i++) q.push(Item (A[i] + B[0], 0)); for (int i = 0; i < n; i++) { Item item = q.top(); q.pop(); C[i] = item.s; int b = item.b; if (b + 1 < n) q.push(Item(C[i] - B[b] + B[b+1], b + 1)); } } int main() { int n; while (scanf("%d", &n) != EOF) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) scanf("%d", &a[i][j]); sort(a[i], a[i] + n); } for (int i = 1; i < n; i++) { merge(a[0], a[i], b, n); for (int ii = 0; ii < n; ii++) a[0][ii] = b[ii]; } printf("%d",a[0][0]); for (int i = 1; i < n; i++) printf(" %d",a[0][i]); printf("\n"); } return 0; }
相关文章推荐
- Python nltk -- Sinica Treebank
- BZOJ1042
- Delphi 在任务栏隐藏程序图标
- leetcode -day31 Subsets I II
- Autofac 的构造函数注入方式
- NBUT 1220 SPY
- 总线设备驱动模型——设备篇
- Unable to execute dex: Multiple dex files define Lorg/ap (
- 如何激活一个window/dialog && 不能直接对Dialog Box使用SetFocus
- [algorithm] graph algorithm
- N-Queens N皇后问题 DFS
- leetcode之路026 Remove Duplicates from Sorted Arrayy
- dinic 模板
- 斯特林数 组合数
- HDU 5399
- Codeforces Gym 100650C The Game of Efil DFS
- Vs2010 配置驱动的开发环境
- iOS视图控制器的跳转方法
- java和javascript双引号嵌套的问题
- 线段树的两种查询方式