zoukankan      html  css  js  c++  java
  • 【折半枚举】(双向搜索)

    折半枚举是一种很好用的枚举方法,比如有时集合过大无法全部搜索,但刚好只需要他们的和或其他可以处理出的东西,就可以一半一半搜

     

    4 Values whose Sum is 0


    题意:a+b+c+d=0 的个数 
    思路:a+b=-(c+d) 
       只与和有关,所以先把 c+d 的和预处理并排序,当 a+b 值一定时,显然 c+d 值也一定,所以只要二分出 
       满足c+d=-(a+b) 的 c+d 的个数即可 

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int a[4040];int b[4040];int ab[8080];
        int c[4040];int d[4040];
        int n;
        while(cin>>n)
        {
            for(int i=0;i<n;i++)
                cin>>a[i];
            for(int i=0;i<n;i++)
                cin>>b[i];
            for(int i=0;i<n;i++)
                cin>>c[i];
            for(int i=0;i<n;i++)
                cin>>d[i];
            int count1=0;
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    ab[count1++]=a[i]+b[j];
              sort(ab,ab+n*n);
              int res=0;
              for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                  {
                      int cd=-(c[i]+d[j]);
                      res+=upper_bound(ab,ab+n*n,cd)-lower_bound(ab,ab+n*n,cd);
                  }
                  cout<<res<<endl;
        }
    }

    Difference(折半枚举,二分)

    我的另一篇随笔有详解:点这儿

  • 相关阅读:
    zabbix:乱码问题
    zabbix--微信报警(未完成)
    ansible-playbook项目(4)
    ansible-playbook(3)
    备份和校验脚本-邮件通知
    rsync
    keepalived
    双机热备
    nginx负载均衡
    LNMP(5)
  • 原文地址:https://www.cnblogs.com/Kohinur/p/9038159.html
Copyright © 2011-2022 走看看