poj2549 Sumsets

题目链接: http://poj.org/problem?id=2549

题意:给你一个含有n(n<=1000)个数的数列,问这个数列中是否存在四个不同的数a,b,c,d,使a+b+c=d;若存在则输出最大的d

思路:完全暴力的话O(n^4),会T,可以考虑双向搜索,公式变形为a+b=d-c;分别枚举a+b和c-d,将值和下标存在结构体中,再二分查找即可

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<map>
using namespace std;
struct Z{
int s;
int x;
int y;
bool operator < (const Z& b)const { return s < b.s; }
}z[1000005],m[1000005];
int n,a[1005];
bool ok(Z& a, Z& b) {
return a.x != b.x && a.y != b.y && a.x != b.y && a.y != b.x;
}
int main(){
while((cin>>n)&&n!=0){
int ans=-536870912;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int k=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){
z[k].s=a[i]+a[j];
z[k].x=i;
z[k++].y=j;
}
int l=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){
m[l].s=a[i]-a[j];
m[l].x=i;
m[l++].y=j;
m[l].s=a[j]-a[i];
m[l].x=j;
m[l++].y=i;
}
sort(z,z+k);
for(int i=0;i<l;i++){
int d=lower_bound(z,z+k,m[i])-z;
if(ok(z[d],m[i])&&z[d].s==m[i].s)
ans=max(ans,z[d].s+a[m[i].y]);
}
if(ans!=-536870912)
cout<<ans<<endl;
else cout<<"no solution"<<endl;
}
}

poj3977 Subset

题目链接: http://poj.org/problem?id=3977

题意:给你一个含n(n<=35)个数的数组,让你在数组中选出一个非空子集,使其元素和的绝对值最小,输出子集元素的个数以及元素和的绝对值,若两个子集元素和相等,输出元素个数小的那个。

思路:如果直接暴力枚举,复杂度O(2^n),n为35时会超时,故可以考虑折半枚举,利用二进制将和以及元素个数存在两个结构体数组中,先预判 两个结构体是否满足题意,再将其中一个元素和取相反数后排序,因为总元素和越接近零越好,再二分查找即可,用lower_bound时考虑查找到的下标和他前一个下标,比较元素和以及元素个数,不断更新即可

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct Z{
long long int x;
int y;
bool operator < (const Z& b)const
{
if(x!=b.x)
return x < b.x;
return y<b.y;
}
}a[300005],b[300005];
long long int c[40];
long long int abs1(long long int x){
if(x<0)
return -x;
return x;
}
int main(){
int n;
while((cin>>n)&&n!=0){
for(int i=0;i<300005;i++)
a[i].x=a[i].y=b[i].x=b[i].y=0;
long long int sum=1e17;
int ans=40;
for(int i=0;i<n;i++)
cin>>c[i];
int n1=n/2;
for(int i=0;i<1<<n1;i++){
for(int j=0;j<n1;j++){
if(i>>j&1&&(i!=0||j!=0)){
a[i-1].x+=c[j];
a[i-1].y++;
}
} }
int n2=n-n1;
for(int i=0;i<(1<<n2);i++){
for(int j=0;j<n2;j++){
if(i>>j&1&&(i!=0||j!=0)){
b[i-1].x+=c[j+n1];
b[i-1].y++;
}
} }
for(int i=0;i<(1<<n1)-1;i++){
if(abs1(a[i].x)<sum){
sum=abs1(a[i].x);
ans=a[i].y;
}
else if(abs1(a[i].x)==sum&&a[i].y<ans){
ans=a[i].y;
sum=abs1(a[i].x);
}
}
for(int i=0;i<(1<<n1)-1;i++)
a[i].x=-a[i].x;
for(int i=0;i<(1<<n2)-1;i++){
if(abs1(b[i].x)<sum){
sum=abs1(b[i].x);
ans=b[i].y;
}
else if(abs1(b[i].x)==sum&&b[i].y<ans){
ans=b[i].y;
sum=abs1(b[i].x);
}
} sort(a,a+(1<<n1)-1);
sort(b,b+(1<<n2)-1);
for(int i=0;i<(1<<n1)-1;i++){
int t=lower_bound(b,b+(1<<n2)-1,a[i])-b;
if(t>0){
if(abs1(b[t-1].x-a[i].x)<sum){
sum=abs1(b[t-1].x-a[i].x);
ans=b[t-1].y+a[i].y;
}
else if(abs1(b[t-1].x-a[i].x)==sum&&b[t-1].y+a[i].y<ans){
sum=abs1(b[t-1].x-a[i].x);
ans=b[t-1].y+a[i].y;
}
}
if(t<(1<<n2)-1){
if(abs1(b[t].x-a[i].x)<sum){
sum=abs1(b[t].x-a[i].x);
ans=b[t].y+a[i].y;
}
else if(abs1(b[t].x-a[i].x)==sum&&b[t].y+a[i].y<ans){
sum=abs1(b[t].x-a[i].x);
ans=b[t].y+a[i].y;
}
} }
cout<<sum<<" "<<ans<<endl;
}
}

poj2785 4 Values whose Sum is 0

题目链接: http://poj.org/problem?id=2785

挑战P160

题意:给你各有n个整数的四个数组,问从每个数列中取出一个数使四个数之和为0,问共有多少种取法,一个数列中有多个相同的数字时,将他们当成不同的数字看待,1<=n<=4000;

思路:完全暴力枚举O(n^4)肯定会超时,可以考虑拆成两半后枚举设四个数a+b+c+d=0,先将a+b所有组合存在一个数组中并排序O(n^2),再枚举c+d(O(n^2)),对于每个c+d,在a+b的数列中二分搜索-(c+d),总复杂度O(n^2*log n);

直接贴书上代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[4005],b[4005],c[4005],d[4005],cd[16000005];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cd[i*n+j]=c[i]+d[j];
sort(cd,cd+n*n);
long long ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
int CD=-(a[i]+b[j]);
ans+=upper_bound(cd,cd+n*n,CD)-lower_bound(cd,cd+n*n,CD);
}
printf("%lld\n",ans);
}

  

poj 折半搜索的更多相关文章

  1. POJ3977:Subset——题解(三分+折半搜索)

    http://poj.org/problem?id=3977 题目大意:有一堆数,取出一些数,记他们和的绝对值为w,取的个数为n,求在w最小的情况下,n最小,并输出w,n. ————————————— ...

  2. 【LOJ#6072】苹果树(矩阵树定理,折半搜索,容斥)

    [LOJ#6072]苹果树(矩阵树定理,折半搜索,容斥) 题面 LOJ 题解 emmmm,这题似乎猫讲过一次... 显然先\(meet-in-the-middle\)搜索一下对于每个有用的苹果数量,满 ...

  3. 2018.11.01 NOIP训练 某种密码(折半搜索)

    传送门 直接折半搜索,把所有和装到unorderedmapunordered_mapunorderedm​ap里面最后统计答案就行了. 然后考试的时候读优并没有处理有负数的情况于是爆零了 代码

  4. [折半搜索][哈希]POJ1186方程的解数

    题目传送门 这道题明显N数据范围非常小,但是M很大,所以用折半搜索实现搜索算法的指数级优化,将复杂度优化到O(M^(N/2)). 将搜出的两半结果用哈希的方式合并(乘法原理). Code: #incl ...

  5. 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  ...

  6. 折半搜索【p4799】[CEOI2015 Day2]世界冰球锦标赛

    Description 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念.他只是单纯的想去看几场比赛.如果他有足够的钱,他会去看所有的比赛.不幸的是,他 ...

  7. JZYZOJ1530 [haoi2013]开关控制 状压 dfs 折半搜索

    http://172.20.6.3/Problem_Show.asp?id=1530 元宵节快要到了,某城市人民公园将举办一次灯展.Dr.Kong准备设计出一个奇妙的展品,他计划将编号为1到N的N(1 ...

  8. 【BZOJ4800】[CEOI2015 Day2]世界冰球锦标赛 (折半搜索)

    [CEOI2015 Day2]世界冰球锦标赛 题目描述 译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.\(Bob ...

  9. 【BZOJ 2679】[Usaco2012 Open]Balanced Cow Subsets(折半搜索+双指针)

    [Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\) ...

随机推荐

  1. Relay外部库使用

    Relay外部库使用 本文介绍如何将cuDNN或cuBLAS等外部库与Relay一起使用. Relay内部使用TVM生成目标特定的代码.例如,使用cuda后端,TVM为用户提供的网络中的所有层生成cu ...

  2. [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun背后做了什么

    [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun背后做了什么 目录 [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun ...

  3. 【NX二次开发】Block UI 多行字符串

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  4. 小程序微信支付(UNIAPP+第三方SDK:binarywang)

    小程序支付流程图说明(UNIAPP+第三方SDK:binarywang) 说明:小程序为UNI-APP开发,使用的第三方微信支付SDK为binarywang提供的,此SDK对微信公众号.小程序.微信各 ...

  5. SpringBoot整合SpringSecurity示例实现前后分离权限注解

    SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证 作者:Sans_ juejin.im/post/5da82f066fb9a04e2a73daec 一.说 ...

  6. 【题解】Luogu P3052 【USACO12】摩天大楼里的奶牛Cows in a Skyscraper

    迭代加深搜索基础 题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A ...

  7. Java通用树结构数据管理

    1.前言 ​ 树结构是一种较为常见的数据结构,如功能权限树.企业的组织结构图.行政区划结构图.家族谱.信令消息树等,都表现为树型数据结构. ​ 树结构数据的共性是树节点之间都有相互关系,对于一个节点对 ...

  8. 【Azure API 管理】APIM集成内网虚拟网络后,启用自定义路由管理外出流量经过防火墙(Firewall),遇见APIs加载不出来问题

    问题描述 使用 Azure 虚拟网络,Azure APIM 可以管理无法通过 Internet 访问的 API,达到以保护企业内部的后端API的目的.在虚拟网络中,启用网络安全组(NSG:Networ ...

  9. c#json将字符串反序列化成对象时不新建类的做法

    在服务端代码文件中加上struct结构体就能解决 struct LocationInfo { public string LocationID { get; set; } public string ...

  10. 流程自动化RPA,Power Automate Desktop系列 - 发布文档中心

    一.背景 内网中有一个基于VuePress搭建的静态文档中心,但是每次修改后都需要重新Build一次才行,之前都是手动执行命令,现在可以基于Power Automate Desktop来创建任务了. ...