洛谷P3067题解
2024-09-04 21:30:04
首先,对于每个数,有三种状态:选入集合A,选入集合B,或者不选入集合。暴力枚举的时间复杂度是 \(O(n\times3^n)\) ,显然跑不过去。
因此考虑 \(\text{Meet in Middle}\) 。记录选取前半部分的数时的总和,然后和右边每次搜索的结果进行匹配。
我设两个集合分别为 \(x,y\) ,则 \(\sum x=\sum y\) 可以转化为 \(\sum x-\sum y=0\) ,所以我们将数字放入集合A可以当做是将总和加上这个数,将数字放入集合B可以当做是将总和减去这个数。那么只需要在枚举右边时算一下左边总和相等的集合有几个就行了,可以用 vector 维护,用 map 进行离散化。
最新文章
- Clang Format
- C# webservice 编写、发布、调用
- Nginx作为负载均衡服务器(Windows环境)
- ICE系列之3对象接口定义语言——slice
- android 2.2 videoView 诡异bug
- 简单选择排序(Java)
- HDU 4997 Biconnected (状态压缩DP)
- 常用git 命令
- Linux vmstat命令详解
- Android数据存储——SQLite数据库(模板)
- NameCheap域名注册商的几个特点介绍
- Kickstart 和 Cobbler ks.cfg文件详解
- Python的特殊成员
- Final阶段第1周/共1周 Scrum立会报告+燃尽图 06
- 算法篇【递归2 -- N皇后问题】
- 玩android 遇到的问题-2014年1月15日
- 使用DataSource绑定一维数组时,DataTextField只需绑定空字符串
- [Objective-C语言教程]类别(28)
- Nginx内容缓存
- 【POI】解析xls报错:java.util.zip.ZipException: error in opening zip file