题目链接:https://vjudge.net/problem/POJ-3977

题意:给一个大小<=35的集合,找一个非空子集合,使得子集合元素和的绝对值最小,如果有多个这样的集合,找元素个数最少的。

思路:显然,可以用折半搜索,分别枚举一半,最大是2的18次方,复杂度能够满足。因为集合非空,枚举时考虑只在前一半选和只在后一半选的情况。对于前一半后一半都选的情况,把前一半的结果存下来,排序,枚举后一半的时候在前一半里二分查找最合适的即可。

思路不难,实现有很多细节,最开始用dfs写得一直wa,改成二进制循环才A。

AC代码:

#include<cstdio>
#include<algorithm>
#include<map>
using namespace std; typedef long long LL;
typedef pair<LL,int> PLI;
const LL inf1=1e17;
const int inf2=0x3f3f3f3f;
int n,m,cnt,ans2;
LL a[],ans1;
PLI b[];
map<LL,int> mp; LL absLL(LL x){
return x>=?x:-x;
} int main(){
while(scanf("%d",&n),n){
mp.clear();
cnt=;
ans1=inf1;
ans2=inf2;
for(int i=;i<=n;++i)
scanf("%lld",&a[i]);
m=n/;
for(int i=;i<(<<m);++i){
LL res1=;
int res2=;
for(int j=;j<m;++j)
if((i>>j)&){
res1+=a[j+];
++res2;
}
if(absLL(res1)<ans1){
ans1=absLL(res1),ans2=res2;
}
else if(absLL(res1)==ans1){
ans2=min(ans2,res2);
}
if(mp.count(res1)){
int tmp=mp[res1];
b[tmp].second=min(b[tmp].second,res2);
}
else{
b[++cnt].first=res1,b[cnt].second=res2;
mp[res1]=cnt;
}
}
sort(b+,b+cnt+);
for(int i=;i<(<<(n-m));++i){
LL res1=;
int res2=;
for(int j=;j<(n-m);++j)
if((i>>j)&){
res1+=a[j++m];
++res2;
}
if(absLL(res1)<ans1){
ans1=absLL(res1),ans2=res2;
}
else if(absLL(res1)==ans1){
ans2=min(ans2,res2);
}
LL tmp=-res1;
int l=,r=cnt,mid;
while(l<=r){
mid=(l+r)>>;
if(b[mid].first<=tmp) l=mid+;
else r=mid-;
}
if(r>){
if(absLL(b[r].first+res1)<ans1){
ans1=absLL(b[r].first+res1);
ans2=b[r].second+res2;
}
else if(absLL(b[r].first+res1)==ans1){
ans2=min(ans2,b[r].second+res2);
}
}
if(r+<=cnt){
if(absLL(b[r+].first+res1)<ans1){
ans1=absLL(b[r+].first+res1);
ans2=b[r+].second+res2;
}
else if(absLL(b[r+].first+res1)==ans1){
ans2=min(ans2,b[r+].second+res2);
}
}
}
printf("%lld %d\n",ans1,ans2);
}
return ;
}

poj3977(折半枚举+二分查找)的更多相关文章

  1. CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。

    1514: Packs Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 61  Solved: 4[Submit][Status][Web Board] ...

  2. Subset POJ - 3977(折半枚举+二分查找)

    题目描述 Given a list of N integers with absolute values no larger than 10 15, find a non empty subset o ...

  3. Subset---poj3977(折半枚举+二分查找)

    题目链接:http://poj.org/problem?id=3977 给你n个数,找到一个子集,使得这个子集的和的绝对值是最小的,如果有多种情况,输出子集个数最少的: n<=35,|a[i]| ...

  4. POJ 2549 Sumsets(折半枚举+二分)

    Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11946   Accepted: 3299 Descript ...

  5. 【折半枚举+二分】POJ 3977 Subset

    题目内容 Vjudge链接 给你\(n\)个数,求出这\(n\)个数的一个非空子集,使子集中的数加和的绝对值最小,在此基础上子集中元素的个数应最小. 输入格式 输入含多组数据,每组数据有两行,第一行是 ...

  6. POJ 3977 Subset(折半枚举+二分)

    SubsetTime Limit: 30000MS        Memory Limit: 65536KTotal Submissions: 6754        Accepted: 1277 D ...

  7. Codeforces H. Prime Gift(折半枚举二分)

    题目描述: Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes input standard ...

  8. POJ 2785 4 Values whose Sum is 0(折半枚举+二分)

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 25675   Accep ...

  9. POJ 3977:Subset(折半枚举+二分)

    [题目链接] http://poj.org/problem?id=3977 [题目大意] 在n个数(n<36)中选取一些数,使得其和的绝对值最小. [题解] 因为枚举所有数选或者不选,复杂度太高 ...

随机推荐

  1. 「NOI 2018」归程「Kruskal 重构树」

    题解 Kruskal重构树:每次一条边连接两个集合,建一个新点,点权为该边边权:把这两个集合的根连向新点. 性质:(如果求的是最大生成树)叶子结点是图中实际结点:叶子到根路径上点权递减:两点间lca的 ...

  2. MySQL数据分析—(4)关系数据库的三个逻辑框架

    (一)前面课程逻辑梳理 任何一门数据的软件也好,数据构架也好,或者说是数据学科也好,最终都是要解决实际问题的,大家说是不是? 前面jacky讲为什么要引入数据库的时候,举了一个案例,大家还记的吗?大家 ...

  3. super关键字和调用父类构造方法

    表示父类对象的默认引用 如果子类要调用父类被覆盖的实例方法,可用super作为调用者调用父类被覆盖的实例方法. 使用super调用父类方法 使用super调用父类的构造方法 调用构造方法 本类中调用另 ...

  4. 以太坊geth区块链私链建立

      以太坊geth区块链私链建立 geth的github https://github.com/ethereum/go-ethereum 下载最新(1.8)的geth,windows下安装很简单 关于 ...

  5. django models 关系

    1.一对多/多对一 class Entry(models.Model): name=models.CharField(max_length=50) def __str__(self): return ...

  6. MySQL 5.7新增加的json数据类型

    MySQL 5.7中有json存储类型了以前我们只能通过php来进行序列化了不过现在就不需要了我们可以直接使用MySQL 5.7的json数据类型来存储json格式数据了,具体来看介绍.   在MyS ...

  7. Linux学习:使用 procrank 测量系统内存使用情况

    程序员应该了解一个基本问题:我的程序使用了多少内存?这可能是一个简单的问题,但是对于像Linux这样的虚拟内存操作系统,答案是相当复杂的,因为top和ps给出的数字不能简单相加.进程中两个最常见的内存 ...

  8. Java动态修改运行环境

    1.pom.xml直接添加一下配置 <profiles> <profile> <id>dev</id> <properties> <a ...

  9. 008-log-slf4j+log4j

    一.slf4j+log4j 1.1.POM依赖 <!-- 日志 门面 --> <dependency> <groupId>org.slf4j</groupId ...

  10. osg(openscenegraph).chm帮助文档

    openscenegraph 3.6.3 链接:https://pan.baidu.com/s/1cQkiTPQx5MIIfxe5FTfjYw 提取码:7w4z openscenegraph  3.4 ...