POJ3977:Subset——题解(三分+折半搜索)
http://poj.org/problem?id=3977
题目大意:有一堆数,取出一些数,记他们和的绝对值为w,取的个数为n,求在w最小的情况下,n最小,并输出w,n。
————————————————————
两天时间,终于搞下。
这题显然我们唯一能做到的只有暴力,但是2^35显然不可取……
但是显然我们折半搜索的话复杂度只有2^18左右所以没问题。
将数分成两堆,每一堆暴力求出所有情况并记录。
然后枚举第一堆,三分第二堆求解即可。
(为什么三分呢?因为绝对值啊,一定最优解是在函数的最低点,所以是单峰函数)
……思路挺简单是不是,但是注意以下几点:
1.n不为零,这点需要特判。
2.三分很容易写跪,具体怎么做看我代码。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll INF=;
inline ll abss(ll a){
if(a<)return -a;
return a;
}
struct num{
ll w;
ll n;
}mp1[],mp2[];
ll a[];
int cnt1=,cnt2=;;
bool in[];
void dfs(int n,int k,bool t){
memset(in,,sizeof(in));
if(!t){
mp1[++cnt1].w=mp1[cnt1].n=;
}
for(int res=;res<=((<<k)-);res++){
int cnt=;
int lz=res;
while(lz){
in[++cnt]=lz-lz/*;
lz/=;
}
ll sum=,num=;
for(int i=;i<=cnt;i++){
int j=i;
if(t)j+=n/;
if(in[i]){
sum+=a[j];
num++;
}
}
if(!t){
mp1[++cnt1].w=sum;
mp1[cnt1].n=num;
}else{
mp2[++cnt2].w=sum;
mp2[cnt2].n=num;
}
}
return;
}
bool cmp(num c,num d){
if(c.w<d.w)return ;
if(c.w>d.w)return ;
if(c.n<d.n)return ;
return ;
}
ll ans,cnt;
void sanfen(int l,int r,num k){
if(r-l<=){
ll t1=abss(k.w+mp2[l].w);
ll t2=abss(k.w+mp2[r].w);
ll t3=abss(k.w+mp2[(l+r)/].w);
ll c1=mp2[l].n+k.n;
ll c2=mp2[r].n+k.n;
ll c3=mp2[(l+r)/].n+k.n;
ll t,c;
if(t1>t2||(t1==t2&&c1>c2)){
t=t2;c=c2;
}else{
t=t1;c=c1;
}
if(t>t3||(t==t3&&c>c3)){
t=t3;c=c3;
}
if(ans>t||(ans==t&&cnt>c)){
ans=t;cnt=c;
}
return;
}
int mid1=(r+*l)/;
int mid2=(l+*r)/;
ll t1=abss(k.w+mp2[mid1].w);
ll t2=abss(k.w+mp2[mid2].w);
if(t1<t2||(t1==t2&&mp2[mid1].n+k.n<mp2[mid2].n+k.n)){
sanfen(l,mid2-,k);
}else{
sanfen(mid1+,r,k);
}
return;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n){
cnt1=,cnt2=;
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
}
dfs(n,n/,);
dfs(n,n-n/,);
sort(mp2+,mp2+cnt2+,cmp);
//for(int i=1;i<=cnt1;i++)printf("1 %lld %lld\n",mp1[i].w,mp1[i].n);
//for(int i=1;i<=cnt2;i++)printf("2 %lld %lld\n",mp2[i].w,mp2[i].n);
ans=INF;cnt=INF;
for(int i=;i<=cnt1;i++){
sanfen(,cnt2,mp1[i]);
if(i>){
if(ans>abss(mp1[i].w)||(ans==abss(mp1[i].w)&&cnt>mp1[i].n)){
ans=abss(mp1[i].w);cnt=mp1[i].n;
}
}
}
printf("%lld %lld\n",ans,cnt);
}
return ;
}
POJ3977:Subset——题解(三分+折半搜索)的更多相关文章
- [题解](折半搜索)luogu_P4799_BZOJ_4800世界冰球锦标赛
抄的题解 以及参考:https://www.cnblogs.com/ZAGER/p/9827160.html 2^40爆搜过不了,考虑折半搜索,难点在于合并左右的答案,因为有可能答案同时载左右两边,我 ...
- [题解](折半搜索/高斯消元枚举自由元)BZOJ_1770_Lights
状压,时间空间都不行,如果每次搜索一半就可以省下很多空间,用map记下每种状态的答案,最后再把两次的答案合并 然而正解是高斯消元解异或方程组,最后搜索自由元 #include<iostream& ...
- 洛谷3067 BZOJ 2679题解(折半搜索)
传送门 BZOJ传送门(权限题) 看到n小于20,就可以想到搜索 所有的数要么在集合a中,要么在集合b中,要么都不在 可是3^n复杂度会炸,我们考虑优化 可以利用折半搜索,将前面一半的所有可能情况与后 ...
- Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索
Codeforces Round #297 (Div. 2)E. Anya and Cubes Time Limit: 2 Sec Memory Limit: 512 MBSubmit: xxx ...
- [NOIP10.4模拟赛]2.y题解--折半搜索+状压计数
题目链接: 咕 闲扯: 这题暴力分似乎挺多,但是一些奇奇怪怪的细节没注意RE了,还是太菜了 分析: 首先我们考虑最naiive的状压DP ,\(f[u][v][state]\)表示u开头,v结尾是否存 ...
- 折半搜索+Hash表+状态压缩 | [Usaco2012 Open]Balanced Cow Subsets | BZOJ 2679 | Luogu SP11469
题面:SP11469 SUBSET - Balanced Cow Subsets 题解: 对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它.对应以上三种情况设置三个系数1.-1.0,于是将 ...
- 【LOJ#6072】苹果树(矩阵树定理,折半搜索,容斥)
[LOJ#6072]苹果树(矩阵树定理,折半搜索,容斥) 题面 LOJ 题解 emmmm,这题似乎猫讲过一次... 显然先\(meet-in-the-middle\)搜索一下对于每个有用的苹果数量,满 ...
- 【BZOJ4800】[CEOI2015 Day2]世界冰球锦标赛 (折半搜索)
[CEOI2015 Day2]世界冰球锦标赛 题目描述 译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.\(Bob ...
- 【BZOJ 2679】[Usaco2012 Open]Balanced Cow Subsets(折半搜索+双指针)
[Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\) ...
随机推荐
- crontab执行PHP
在stackoverflow上看到一个问题:http://stackoverflow.com/questions/14015543/crontab-php-wget-or-curl 有三种通过cron ...
- SpringBoot入门(五)——自定义配置
本文来自网易云社区 大部分比萨店也提供某种形式的自动配置.你可以点荤比萨.素比萨.香辣意大利比萨,或者是自动配置比萨中的极品--至尊比萨.在下单时,你并没有指定具体的辅料,你所点的比萨种类决定了所用的 ...
- 怎样安装JMeter
JMeter有图形界面, 而且支持中文! JMeter官网地址: http://jmeter.apache.org/ 点击左上角的下载: 点击下面的.zip后缀的压缩包: 解压到本地: JMeter目 ...
- Cannot assign requested address (connect failed)
压测时,应用服务器报错:Cannot assign requested address (connect failed) 经检查,由于应用服务器,频繁发起http请求,由于每次连接都在很短的时间内结束 ...
- 第3章 TCP协议详解
第3章 TCP协议详解 3.1 TCP服务的特点 传输协议主要有两个:TCP协议和UDP协议,TCP协议相对于UDP协议的特点是 面向连接使用TCP协议通信的双方必须先建立连接,完成数据交换后,通信双 ...
- [Clr via C#读书笔记]Cp2生成打包部署和管理应用程序和类型
Cp2生成打包部署和管理应用程序和类型 部署问题 DLL Hell;安装的复杂性:安全性:代码访问安全性. csc.exe的简单使用. 元数据 定义表:引用表:清单表: 程序集 重用,版本控制,安全的 ...
- ionic LoadingController 模块使用
html 代码: <ion-header> <ion-navbar> <ion-title>Loading</ion-title> </ion-n ...
- Ubuntu—安装并运行sublime
step1 到官网看看 https://www.sublimetext.com/3 step2 根据版本选择,我的是32位的 step3 ubuntu终端安装 (1)切换目录 -$ cd /opt ...
- 感知机(perceptron)
- iscroll手册
概述: 大家在日常工作中最常用的插件是什么,jQurey?Lazyload?但是这些都是在PC端,但是在移动端最常用的插件莫过于iScroll了,iScroll到底是什么东西,应该怎么用?iScrol ...