题意:

给定各有n个整数的四个数列A、B、C、D。要从每个数列中各取出1个数,使四个数的和为0。求出这样的组合的个数。当一个数列中有多个相同的数字时,把它们作为不同的数字看待。

分析:

如果直接对四个数列进行枚举的话,将是O(n^4)的复杂度,因此可以考虑折半枚举的思想。

将A、B数组相加的所有可能性列出来加入数组,O(n^2),再进行排序,O(n^2 logn),再对C、D数组相加的所有可能性进行枚举,O(n^2),再对枚举出的每一个值在第一个排序过的数组中进行二分搜索,O(logn)。大大降低了时间复杂度,这种思想需要学习。

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int SIZE = 4010;int a[5][SIZE];
int ans1[SIZE*SIZE],ans2[SIZE*SIZE];
int n,num1,num2;int main()
{while(~scanf("%d",&n)){rep(i,1,n)scanf("%d%d%d%d",&a[1][i],&a[2][i],&a[3][i],&a[4][i]);num1 = 0;rep(i,1,n)rep(j,1,n)ans1[++num1] = a[1][i]+a[2][j];num2 = 0;rep(i,1,n)rep(j,1,n)ans2[++num2] = a[3][i]+a[4][j];int cnt = 0;sort(ans2+1,ans2+1+num2);rep(i,1,num1){int x = (-1)*ans1[i];cnt += upper_bound(ans2+1,ans2+1+num2,x)-lower_bound(ans2+1,ans2+1+num2,x);//巧妙运用lower_bound和upper_bound可以实现所有需要的二分形式//并且更加准确//需要充分掌握//因为如果数据中出现大量的相同元素,单纯的二分便不再适用,使用现有的函数更加高效 }printf("%d\n",cnt);} return 0;
} 

【POJ 2785】【折半枚举】4 Values whose Sum is 0【暑期 No.6】相关推荐

  1. poj2785 4 Values whose Sum is 0

    原题链接: poj2785 4 Values whose Sum is 0 题意:给出元素都为n的4个数组A,B,C,D,要从每个数组中各取一个数,求这四个数和为0的次数,一个数列有多个相同数字时,当 ...

  2. 【POJ - 2785】4 Values whose Sum is 0 (二分,折半枚举)

    题干: The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, com ...

  3. POJ 2785 4 Values whose Sum is 0

    传送门:http://poj.org/problem?id=2785 解题思路: 从这四个数列中选择的话总有n的4次方中情况,所以全部判断一遍不可行.不过将他们对半分成AB和CD再考虑的话就可以解决了 ...

  4. POJ 2785: 4 Values Whose Sum is 0

    链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21897 题意:就是给你4个数组,现在问你有多少种方案,使得在每个数组中 ...

  5. 【ACM】Uva 1152 (4 Values whose Sum is 0) 二分查找lower_bound() 和upper_bound()的使用

    [问题描述] The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, ...

  6. uva1152 - 4 Values whose Sum is 0(hash或STL技巧ac)

    题目大意:给定4个n(1 <= n <= 4000)元素集合A, B, C, D,要求分别从中选取一个元素a, b, c, d,使得a+b+c+d = 0,问有多少种选法. method ...

  7. uva 1152 ——4 Values whose Sum is 0

    题意:给定4个n元素集合,要求从每个集合中选择一个数,使得A+B+c+d==0,问存在多少种方法. 思路:枚举+hash判断.直接枚举4次方的算法会超,那么只需要枚举ab,然后在c+d的和中查找等于- ...

  8. Subset POJ - 3977(折半枚举+二分+二进制枚举)

    题意: 给你一个集合N(N<=35),问集合的子集,除了空集,使得自己中所有元素和的绝对值最小,若存在多个值,那么选择子集中元素最少的那个. 题目: Given a list of N inte ...

  9. POJ 3373 模运算 + 折半枚举

    题意 传送门 POJ 3373 题解 置换 nnn 部分数位上的数字得到 mmm,其能被 kkk 整除,且置换数位最少,有多个 mmm 满足上述条件则求最小值. 考虑到 k≤104k\leq 10^4 ...

  10. poj_3977 折半枚举

    题目大意 给定N(N<=35)个数字,每个数字都<= 2^15. 其中一个或多个数字加和可以得到s,求出s的绝对值的最小值,并给出当s取绝对值最小值时,需要加和的数字的个数. 题目分析 需 ...

最新文章

  1. Android Studio教程10-Intent的详细使用
  2. javaWEB开发中get方式请求的乱码问题解决
  3. RxSwift之深入解析dispose源码的实现原理
  4. ANSYS CFX 脚本详细设置,实现循环计算
  5. 【视频】CCNA——telnet和SSH的配置
  6. Supervised Convolutional Neural Network
  7. JS中自动执行函数小结
  8. 9203-1203-随堂笔记-窗体通讯录
  9. Fixchart图表组件——介绍
  10. Windows Phone 7 中BingMap控件的使用
  11. C# .net 多线程中集合数据同步
  12. 新版谷歌浏览器开启Flash支持,开启flash方法
  13. SQL Server中查询累计和与滑动平均值
  14. matlab中beta是什么软件,软件版本中的beta是什么意思?
  15. 树莓派3代ROS系统镜像文件下载链接
  16. 历史名酒元氏益成永——宋曹贡酒
  17. 使用openssl进行证书格式转换
  18. 【python学习笔记——工具视频帧率计算器】
  19. 吴恩达深度学习 | (18) 卷积神经网络专项课程第二周学习笔记
  20. 青岛计算机考试试题,2016年计算机一级上机考试题「word版」

热门文章

  1. display:table-cell 在页面中的应用
  2. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》
  3. Spring的bean管理(注解注入属性)
  4. python 3d绘图kmeans_使用python绘制3d的图形
  5. 5. Keras - CNN应用于手写数字识别
  6. html手机弧线div,纯css实现让div的四个角成弧形
  7. bat打包成exe_拜托!看完这篇文章别再问我怎么Python打包成exe了!
  8. 【UVA11168】Airport(凸包+点到直线距离(一般式))
  9. 【CF Round #534 Div2】B:Game with string(水题,积累思路)
  10. 在linux添加驱动程序,linux下静态/动态加载驱动的两种方式