【Foreign】K优解 [堆]
K优解
Time Limit: 20 Sec Memory Limit: 512 MB
Description
Input
Output
一行一个数表示答案。
Sample Input
11 21
9 25
17 19
Sample Output
HINT
Solution
先对于每个 i,将每行的 a[i][1]~a[i][m] 从小到大排序,再将行按照其元素差值为多关键字排序(共m-1个关键字)。
那么我们知道,最小的方案肯定是所有行都取第一个。由于其有一些特殊,我们先抛开这个方案。
我们知道,次小的方案是(2,1,1,1…),把这个状态加入堆,由较优方案扩展较劣方案,对于每一个状态,我们记录其扩展到第几行,以及取第几个元素。
在已经得到前 k 优的方案时,当前所有方案中还未扩展的最好的方案x(其最后扩展位置为 i),就是第 k+1 优。
从方案x,我们可以扩展出几个较劣解:
1、x 的第 i 个元素不取m:将 i 行取的元素增加1(扩展位置为 i)
2、i + 1 <= n:将 i+1 行取为2(扩展位置为 i+1)
3、x 的第 i 个元素取为2 且 i + 1 <= n:将 i 行取为1,i+1 行取为2(扩展位置为 i+1)
由此,每个解都可由唯一的优于它的解扩展得来。
用个堆维护一下,每次取出最小的即可。
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
typedef long long s64; const int ONE = ;
const int MOD = 1e9 + ; int n, m, k;
vector <int> A[ONE];
int id[ONE];
s64 Ans; struct power
{
s64 val;
int pt, id;
bool operator <(power a) const
{
return a.val < val;
}
};
priority_queue <power> q; int cmp(int a, int b)
{
for(int i = ; i < m; i++)
{
if(A[a][i + ] - A[a][i] < A[b][i + ] - A[b][i]) return ;
if(A[a][i + ] - A[a][i] > A[b][i + ] - A[b][i]) return ;
}
return ;
} int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} int main()
{
n = get(); m = get(); k = get();
for(int i = ; i <= n; i++)
{
A[i].push_back();
for(int j = ; j <= m; j++)
A[i].push_back(get());
sort(A[i].begin(), A[i].end());
id[i] = i;
} sort(id + , id + n + , cmp); s64 res = ;
for(int i = ; i <= n; i++) res += A[i][];
Ans = res; q.push((power){res - A[id[]][] + A[id[]][], , }); for(int i = ; i <= k; i++)
{
power u = q.top(); q.pop();
Ans ^= u.val; if(u.id + <= m)
q.push((power){u.val - A[id[u.pt]][u.id] + A[id[u.pt]][u.id + ], u.pt, u.id + });
if(u.pt + <= n && <= m)
q.push((power){u.val - A[id[u.pt + ]][] + A[id[u.pt + ]][], u.pt + , });
if(u.pt + <= n && u.id == )
q.push((power){u.val - A[id[u.pt]][] + A[id[u.pt]][] - A[id[u.pt + ]][] + A[id[u.pt + ]][], u.pt + , });
} printf("%lld", Ans);
}
【Foreign】K优解 [堆]的更多相关文章
- hdu 2639 Bone Collector II (01背包,求第k优解)
这题和典型的01背包求最优解不同,是要求第k优解,所以,最直观的想法就是在01背包的基础上再增加一维表示第k大时的价值.具体思路见下面的参考链接,说的很详细 参考连接:http://laiba2004 ...
- HDU 2639 (01背包第k优解)
/* 01背包第k优解问题 f[i][j][k] 前i个物品体积为j的第k优解 对于每次的ij状态 记下之前的两种状态 i-1 j-w[i] (选i) i-1 j (不选i) 分别k个 然后归并排序并 ...
- 01背包之求第K优解——Bone Collector II
http://acm.hdu.edu.cn/showproblem.php?pid=2639 题目大意是,往背包里赛骨头,求第K优解,在普通01背包的基础上,增加一维空间,那么F[i,v,k]可以理解 ...
- hdu2639(背包求第k优解)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值 分析:dp[i][j][k]表 ...
- 关于01背包求第k优解
引用:http://szy961124.blog.163.com/blog/static/132346674201092775320970/ 求次优解.第K优解 对于求次优解.第K优解类的问题,如果相 ...
- (01背包 第k优解) Bone Collector II(hdu 2639)
http://acm.hdu.edu.cn/showproblem.php?pid=2639 Problem Description The title of this problem i ...
- 背包的第k优解[动态规划]
From easthong ☆背包的第k优解 描述 Description DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是 ...
- dp之01背包hdu2639(第k优解)
http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值.......(注意,不要 和它的第一题混 ...
- Bone Collector II---hdu2639(01背包求第k优解)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639求01背包的第k大解.合并两个有序序列 选取物品i,或不选.最终的结果,是我们能在O(1)的时间内 ...
随机推荐
- Jedis源码解析——Jedis和BinaryJedis
1.基本信息 先来看看他们的类定义: public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommands ...
- Ubuntu 12.04.1 LTS 升级 PHP 从5.3 到 5.5
#!/bin/bash # desc install php5.5 #add-apt-repository ppa:ondrej/php5 #apt-get install python-softwa ...
- git工具SourceTree工作流
分支模型 master 用来最终上线的分支,最终发布版本,整个项目中有且只有一个 develop 项目中用来开发的分支,原则上项目中有且只有一个,develop 分支下面的分支是经常变化的,会创建新的 ...
- sublime Text3 设置用新标签页打开新的文件
今天用sublime Text3 打开项目文件,发现单击文件就可以打开,但是有一个问题:每次打开新文件就会覆盖当前的标签页,无法在新的标签页打开.于是在网上查了一下. 网上有人说在Preference ...
- shell基础练习题讲解
1037774765 克隆 1.创建一个用户redhat,其ID号为1001,基本组为like(组ID为2002),附近租为linux. groupadd -g 2002 likegroupadd l ...
- 百度地图常用2.0使用以及调用js
/** * 生成一条路线 * @param {Object} baiduMap 百度地图的 map对象 * @param {Object} lineColor 线路颜色 * @param {Objec ...
- Delphi DBGridEH中,选中行、列、单元格
// 新增行后,默认首列 procedure TForm1.ADOQuery1AfterInsert(DataSet: TDataSet);begin with DBGridEh1 do begi ...
- RT-thread内核之互斥量
一.互斥量控制块:在include/rtdef.h中 #ifdef RT_USING_MUTEX /** * Mutual exclusion (mutex) structure */ struct ...
- BZOJ 3507 通配符匹配(贪心+hash或贪心+AC自动机)
首先可以对n个目标串单独进行处理. 对于每个目标串,考虑把模式串按'*'进行划分为cnt段.首尾两段一定得于原串进行匹配.剩下的cnt-2段尽量与最靠左的起点进行匹配. 对于剩下的cnt-2段.每段又 ...
- CF995C Leaving the Bar
题目描述 For a vector v⃗=(x,y) \vec{v} = (x, y) v=(x,y) , define ∣v∣=x2+y2 |v| = \sqrt{x^2 + y^2} ∣v∣=x2 ...