博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TYVJ 1340 折半暴搜+二分
阅读量:5235 次
发布时间:2019-06-14

本文共 1166 字,大约阅读时间需要 3 分钟。

思路:

1.
这 题 不卡常过不去啊……
(先加一个random_shuffle)
首先 我们可以折半 搜这一半可以到达的重量 sort一遍

然后搜另一半 对于路程中每一个解 我们可以二分前一半中加这个解最接近w的值,更新ans

剪枝:

对于第一次搜索 显然的剪枝:和不能大于w
对于第二次搜索 如果当前的解小于最大的remain 退出

我的搜索纯凭运气&数据…… 数据和w相差比较小就能过。

2.
LH大爷的思路(可惜T了…)(这题不卡数据是人?)
也是折半
然后二进制枚举每个选不选
s[i]表示
对于每个i s[i^ (1<< lowbit(i))]的值肯定是已知的。
s[i]=s[(i xor (1<<(f[i]-1)))]+a[f[i]]
sort一遍s
后面枚举 同理 二分同上…
然而t了。。

(感谢lydrainbowcat&LH大爷……)

//By SiriusRen#include 
#include
#include
using namespace std;unsigned int n,w,a[66],half,maxx,ans=0x3fffffff;unsigned int s[20000000],top;inline void dfs(int x,int remain){ s[top++]=remain; for(int i=x;i>=1;i--){ int t=remain-a[i]; if(t>=0)dfs(i-1,t); }}inline void dfs2(int x,int tot){ if(s[top]>=tot){ int t=lower_bound(s,s+top,tot)-s,jy=s[t]-tot; if(ans>jy)ans=jy; for(int i=x;i>=half;i--) dfs2(i-1,tot+a[i]); }}int main(){ scanf("%d%d",&w,&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); half=(n+1)/2; random_shuffle(a+1,a+1+n); dfs(half,w); sort(s,s+top); half++;top--; dfs2(n,0); cout<

这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532308.html

你可能感兴趣的文章
解决miner.start() 返回null
查看>>
bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
查看>>
BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
查看>>
定制jackson的自定义序列化(null值的处理)
查看>>
auth模块
查看>>
javascript keycode大全
查看>>
前台freemark获取后台的值
查看>>
log4j.properties的作用
查看>>
游戏偶感
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
discuz 常用脚本格式化数据
查看>>
洛谷P2777
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
SQL查询总结 - wanglei
查看>>