UVA 11997 K Smallest Sums (多路归并)
来源:互联网 发布:java 博客园 编辑:程序博客网 时间:2024/06/05 01:42
题意:
求k∗k矩阵每个选一个数的kk组合的前k小和
分析:
首先对于n=2的状况,两个数组为a,b
那么我们对于每个ai可以得到
1:a[1]+b[1]<=a[1]+b[2]<=...<=a[1]+b[n]
....
n:a[n]+b[1]<=a[n]+b[2]<=...<=a[n]+b[n]
对于第k个表得到a[k]+b[k],我们使用二元组(S,B)表示一个元素,其中S=a[k]+b[k],B是b的下标
a的下标不用记录,因为对于下一个二元组(S′,B+1),有S‘=a[k]+b[k+1]=S−b[k]+b[k+1]
不过本题有n个表,我们可以通过两两合并就可以得出答案
代码:
//// Created by TaoSama on 2015-11-04// Copyright (c) 2015 TaoSama. All rights reserved.////#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << " "#define prln(x) cout << #x << " = " << x << endlconst int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;int n, a[755], b[755];typedef pair<int, int> P;void merge() { priority_queue<P, vector<P>, greater<P> > q; for(int i = 1; i <= n; ++i) q.push(P(a[i] + b[1], 1)); for(int i = 1; i <= n; ++i) { P u = q.top(); q.pop(); a[i] = u.first; int idx = u.second; if(idx < n) q.push(P(u.first - b[idx] + b[idx + 1], idx + 1)); }}int main() {#ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);// freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); while(scanf("%d", &n) == 1) { for(int i = 1; i <= n; ++i) scanf("%d", a + i); sort(a + 1, a + 1 + n); for(int i = 2; i <= n; ++i) { for(int j = 1; j <= n; ++j) scanf("%d", b + j); sort(b + 1, b + 1 + n); merge(); } for(int i = 1; i <= n; ++i) printf("%d%c", a[i], " \n"[i == n]); } return 0;}
0 0
- UVA 11997 K Smallest Sums (多路归并)
- 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(优先队列多路归并)
- (UVa 11997)K Smallest Sums --多路归并问题,优先队列
- 思路题,多路归并(K Smallest Sums,UVA 11997)
- UVA K Smallest Sums(多路归并,优先队列)
- UVA 11997 K Smallest Sums(多路归并求前k个最小和的值)
- UVA 11997--K Smallest Sums+优先队列用于多路归并
- UVa 11997 K Smallest Sums (优先队列 & k路归并化为两两归并)
- 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
- zcmu1674
- Tomcat中JVM内存溢出及合理配置
- Android应用程序创建热点以及自动链接Wifi,我遇到的问题以及我是怎么解决的
- 命令行目录太长?只显示当前目录方法
- windows 多线程捕获未处理的异常,防止崩溃的地方影响到其它线程
- UVA 11997 K Smallest Sums (多路归并)
- 关于CAD各个版本使用编码方式的总结:
- PHP配置文件
- 一方库、二方库、三方库
- perl 分析binlog 生成update sql
- Android 的服务-Service
- C语言
- GUI布局学习1
- C项目开发—通讯录(三) 删除、修改、搜索功能、源码发放