[poj] 3977 Subset || 折半搜索MITM
原题
给定N个整数组成的数列(N<=35),从中选出一个子集,使得这个子集的所有元素的值的和的绝对值最小,如果有多组数据满足的话,选择子集元素最少的那个。
n<=35,所以双向dfs的O(2^(n/2))可以直接解决问题。因为会爆空间,所以枚举前一半的二进制状态来完成dfs,并用map记录每个状态所用的个数,然后枚举后一半的状态在map中找第一个大于等于他的和第一个小于他的,比较这两个答案。
注:long long 没有自带的abs,并且在define里要多打括号,因为优先度……
#include<cstdio>
#include<map>
#define abs(x) ((x)>0?(x):-(x))
typedef long long ll;
using namespace std;
ll n,a[40],ans,sum;
int cnt;
map <ll,int> mp;
map <ll,int> :: iterator qwq;
ll read()
{
ll ans=0,fu=1;
char j=getchar();
for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
if (j=='-') j=getchar(),fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
}
int main()
{
while (~scanf("%lld",&n) && n)
{
mp.clear();
ans=0;
cnt=0;
for (int i=1;i<=n;i++)
a[i]=read();
ans=abs(a[1]);
cnt=1;
for (int i=1,j,now,count;i<(1<<(n/2));i++)
{
sum=0;
j=i;
now=0;
count=0;
while (j)
{
if (j&1)
sum+=a[now+1],count++;
j>>=1;
now++;
}
if (abs(sum)<ans)
{
ans=abs(sum);
cnt=count;
}
else if (abs(sum)==ans) cnt=min(cnt,count);
if (mp[sum])
mp[sum]=min(mp[sum],count);
else
mp[sum]=count;
}
for (int i=1,j,now,count;i<(1<<(n-n/2));i++)
{
j=i;
sum=0;
count=0;
now=0;
while (j)
{
if (j&1)
sum+=a[now+n/2+1],count++;
j>>=1;
now++;
}
if (abs(sum)<ans)
{
ans=abs(sum);
cnt=count;
}
else if (abs(sum)==ans) cnt=min(cnt,count);
qwq=mp.lower_bound(-sum);
ll nw;
if (qwq!=mp.end())
{
nw=sum+qwq->first;
nw=abs(nw);
if (nw<ans)
{
ans=nw;
cnt=qwq->second+count;
}
else if (nw==ans) cnt=min(cnt,qwq->second+count);
}
if (qwq!=mp.begin())
{
qwq--;
nw=sum+qwq->first;
nw=abs(nw);
if (nw<ans)
{
ans=nw;
cnt=qwq->second+count;
}
else if (nw==ans) cnt=min(cnt,qwq->second+count);
}
}
printf("%lld %d\n",ans,cnt);
}
return 0;
}
[poj] 3977 Subset || 折半搜索MITM的更多相关文章
- POJ 3977 Subset | 折半搜索
题目: 给出一个整数集合,求出非空子集中元素和绝对值最小是多少(元素个数尽量少) 题解: 分成两半 爆搜每一半,用map维护前一半的值 每搜出后一半的一个值就去map里找和他和绝对值最小的更新答案 # ...
- POJ 3977 - subset - 折半枚举
2017-08-01 21:45:19 writer:pprp 题目: • POJ 3977• 给定n个数,求一个子集(非空)• 使得子集内元素和的绝对值最小• n ≤ 35 AC代码如下:(难点:枚 ...
- POJ 3977 Subset(折半枚举+二分)
SubsetTime Limit: 30000MS Memory Limit: 65536KTotal Submissions: 6754 Accepted: 1277 D ...
- poj 3977 Subset(折半枚举+二进制枚举+二分)
Subset Time Limit: 30000MS Memory Limit: 65536K Total Submissions: 5721 Accepted: 1083 Descripti ...
- 【折半枚举+二分】POJ 3977 Subset
题目内容 Vjudge链接 给你\(n\)个数,求出这\(n\)个数的一个非空子集,使子集中的数加和的绝对值最小,在此基础上子集中元素的个数应最小. 输入格式 输入含多组数据,每组数据有两行,第一行是 ...
- POJ - 3977 Subset(二分+折半枚举)
题意:有一个N(N <= 35)个数的集合,每个数的绝对值小于等于1015,找一个非空子集,使该子集中所有元素的和的绝对值最小,若有多个,则输出个数最小的那个. 分析: 1.将集合中的元素分成两 ...
- POJ 3977 Subset
Subset Time Limit: 30000MS Memory Limit: 65536K Total Submissions: 3161 Accepted: 564 Descriptio ...
- POJ3977:Subset——题解(三分+折半搜索)
http://poj.org/problem?id=3977 题目大意:有一堆数,取出一些数,记他们和的绝对值为w,取的个数为n,求在w最小的情况下,n最小,并输出w,n. ————————————— ...
- bzoj2679: [Usaco2012 Open]Balanced Cow Subsets(折半搜索)
2679: [Usaco2012 Open]Balanced Cow Subsets Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 462 Solv ...
随机推荐
- cncert阅读报告
信息安全阅读报告 Problem 1: 国家计算机网络应急技术处理协调中心(简称“国家互联网应急中心”,英文缩写为“CNCERT”或“CNCERT/CC”)作为我国非政府层面网络安全应急体系核心技术协 ...
- CentOS 系统 Docker 的命令大全
本文记录 CentOS 系统 Docker 的命令大全 命令 docker ps 显示运行中的容器 docker ps -a 显示所有容器 docker start 容器名称 启动容器 docker ...
- 连接MYSQL 错误代码2003
问题是服务里面mysql没有启动或者mysql服务丢失 解决办法: 开始->运行->cmd,进到mysql安装的bin目录(以我的为例,我的安装在D盘)D:\MySQL\bin>my ...
- Ubuntu 下安装GIMP
1.Add GIMP PPA Open terminal from Unity Dash, App launcher, or via Ctrl+Alt+T shortcut key. When it ...
- Mysql 索引 简介
Mysql索引 索引的分类 索引的创建 索引的注意事项 什么是索引 索引是存储引擎用于快速查找记录的一种数据结构. 索引由数据库中一列或者多列组成,作用是提高表的查询速度. 索引的优点,提高检索数据的 ...
- C# 窗口关闭事件
首先添加一个退出事件函数 //退出按键 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { DialogRe ...
- spark练习--统计xxx大学的各个少数名族的情况
最近,有一份数据,是关于学校的数据,这个里面有所有学生的信息,今天闲来没事,我就想用spark的方式来读取文件,并且来统计这个学校的各个民族的情况,以前我用hadoop中mapReduce来计算,不得 ...
- Dapper基础增删查改、事务和存储过程
1.前言 Dapper是一个轻量级的orm框架,上手也非常的简单,它可以实体映射,所以先准备实体如下: public class Couser { public int id { get; set; ...
- border与透明边框
1.背景:怎样增加复选框响应域的大小?就是,复选框点击区域增大一些 需求复选框的视觉区域大小(不含边框)是16px*16px 现在要把可点击区域增加到20px*20px 解决方案: box-shado ...
- 简洁好看的form样式收藏
本文转载自 http://www.laozuo.org/3495.html 为了方便自己查阅所以搬运过来,如有侵权希望原作者联系我删除不要突然去法院告我呀! 颜色样式啥的都可以根据需求自己调整的,这些 ...