TYVJ 1340 折半暴搜+二分
2024-10-01 15:17:09
思路:
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 <cstdio>
#include <iostream>
#include <algorithm>
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<<w-ans;
}
最新文章
- 【nodejs笔记4】搭建多人博客<;内含http请求的get post方法区别>;
- CSS控制表格(table)样式
- 浅谈T-SQL中的派生表和CTE
- Maven Java EE Configuration Problem 的完美解决办法
- android平台手电筒开发源代码
- bjfu1252 贪心
- BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划( dp)
- SQL点滴20—T-SQL中的排名函数
- Gulp安装使用教程
- php trim源码分析
- 关于一些基础的Java问题的解答(二)
- What is the best way to handle Invalid CSRF token found in the request when session times out in Spring security
- C# 《编写高质量代码改善建议》整理&;笔记 --(六)编码规范及习惯
- Kafka设计原理
- rabbitmq学习(三) —— 工作队列
- 配置Oracle E-Business Suite Integrated SOA Gateway Release 12.1.2/12.1.3
- 【IL】IL指令详解
- 使用InputStreamReader读入,使用OutputStreamWriter写出,将一首诗按行重写?
- LeetCode - Duplicate Emails
- 【递推】【组合数】【容斥原理】UVA - 11806 - Cheerleaders
热门文章
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
- sqlite学习笔记11:C语言中使用sqlite之删除记录
- MapReduce运行流程具体解释
- 使用docker搭建hadoop分布式集群
- 使用malloc分别分配2KB的空间,然后用realloc调整为6KB的内存空间,打印指针地址
- 【c++版数据结构】之顺序表的实现
- war包放入tomcat
- SparkSession - Spark SQL 的 入口
- 前端的console.log的效果写法
- 静态构造函数c# 静态块java initallize oc