poj 3977 Subset
来源:互联网 发布:java面试宝典2017版 编辑:程序博客网 时间:2024/06/05 18:35
题意:在一个集合中找到一个非空子集使得这个子集元素和的绝对值尽量小,和绝对值相同时保证元素个数尽量小
分析:1.二分枚举的思想,先分成两个集合;
2.枚举其中一个集合中所有的子集并且存到数组中,并排序;
3.枚举另一个集合中所有的子集并且与第一个集合中的合适子集相加(可以通过二分查找在数组中找到最合
适的元素)
4.这个题特别坑的地方是不能用abs库函数,只能手写,学长告诉因为c++11以前版本里面没有abs long long 的
定义,不过竟然写宏定义也WA不知为何?请路过大神指教
总结:又写了一个晚上,因为设计的失败和情况没有想全面,尽量以后再做题的时候,提前先尽量多的想好细节
问题,避免傻愣愣的直接敲代码。
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;typedef long long LL;typedef pair<LL,int>pii;#define MAXN 300000#define MAXM 40#define X first#define Y second//#define ABS(i) ((i)>0?(i):(-i))pii sum[MAXN],ans;LL arr[MAXM];int n,mid;LL ABS(const LL & i){ return ((i)>0?(i):(-i));}void check(LL cur,int num){ int ind = lower_bound(sum,sum + (1 << mid),pii(-cur,0)) - sum; for(int i = min(ind,(1 << mid) - 1);i >= max(ind - 1,0);i--) ans = min(ans,pii(ABS(cur + sum[i].X),num + sum[i].Y));}int main(){ while(scanf("%d",&n),n) { for(int i = 0;i < n;i++) scanf("%lld",&arr[i]); mid = n >> 1; ans = pii(ABS(arr[0]),1); for(int i = 0;i < 1 << mid;i++) { int num = 0; sum[i].X = 0; for(int j = 0;j < mid;j++)if(i >> j & 1) { num++; sum[i].X += arr[j]; } sum[i].Y = num; if(i)ans = min(ans,pii(ABS(sum[i].X),sum[i].Y)); } sort(sum,sum + (1 << mid)); for(int i = 0;i < (1 << mid) - 1;i++) if(sum[i].X == sum[i + 1].X) sum[i + 1].Y = sum[i].Y; for(int i = 1;i < 1 << (n - mid);i++) { LL cur = 0; int num = 0; for(int j = 0;j < n - mid;j++)if(i >> j & 1) { num++; cur += arr[mid + j]; } check(cur,num); } printf("%lld %d\n",ans.X,ans.Y); }}
0 0
- POJ-3977-Subset
- poj 3977 Subset
- POJ 3977Subset
- POJ 3977Subset
- poj 3977 Subset 枚举+二分
- poj 3977 Subset 折半枚举
- POJ - 3977 Subset(折半枚举)
- POJ 3977 Subset 已翻译
- Subset POJ
- POJ 3977Subset(枚举+二分)
- POJ 3977 Subset (折半枚举)
- POJ 3977 Subset (折半枚举+二分)
- Poj 3977 Subset 折半枚举 超大背包
- POJ 3977 Subset (简单折半枚举)
- poj 3977 Subset(折半枚举+状压dp)
- POJ 3977 Subset(折半枚举 + 二分查找)
- subset
- Subset
- 如何自学Android
- Frogs' Neighborhood——(青蛙的邻居)
- 协程 及 libco 介绍
- DE1——soc第一步实现流水灯
- HDU 2571 命运 (dp)
- poj 3977 Subset
- 【网络协议】HTTP协议笔记
- B站挂了,无题YY
- 一个关于socket在非阻塞模式下connect是否成功的例子
- POJ 2185 Milking Grid (二维KMP next数组)
- Machine Learning in action:k-Nearest Neighbor
- Python: socket,address already in use处理
- postgresql sql create table
- 设置Outlook不删除服务器邮件备份