输入n,表示a b c d 四个集合都有n个元素。之后每行输入4个集合中的一个元素。求这四个集合每个集合中拿出一个数相加等于0的组数。

思路

如果直接搜,复杂度为O(N^3),时间不满足要求。 
折半搜索比较适合,把4个数字分成两份,分别两两求和,得到两个长度n*n的一维数组,排序后比较进行匹配即可。 
另外这个题还可以用hash,具体参考:POJ2785 4 Values whose Sum is 0(哈希)

代码

Source CodeProblem: 2785       User: liangrx06
Memory: 49276K      Time: 7016MS
Language: C++       Result: Accepted
Source Code
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;const int N = 4000;int n, m;
int a[4][N];
int x[N*N], y[N*N];int main(void)
{cin >> n;m = n*n;for (int i = 0; i < n; i ++)for (int j = 0; j < 4; j ++)scanf("%d", &a[j][i]);for (int i = 0; i < n; i ++)for (int j = 0; j < n; j ++)x[i*n+j] = a[0][i] + a[1][j];for (int i = 0; i < n; i ++)for (int j = 0; j < n; j ++)y[i*n+j] = a[2][i] + a[3][j];sort(y, y+m);long long ans = 0;for (int i = 0; i < m; i ++)ans += (upper_bound(y, y+m, -x[i]) - lower_bound(y, y+m, -x[i]));printf("%lld\n", ans);return 0;
}

两两一组进行查询。这里注意两个函数upper_bound和 lower_bound分别是第一次出现和最后一次出现的位置。两者相减就是一共的个数。

poj2785 二分查找相关推荐

  1. poj2785 二分查找

    题目大意:给定n行数(n<=4000),每行4个数.从这4列中,每列选择一个数使其和为0 暴力枚举 O(n^4)会tle. 优化:枚举第1,2列算出总和s1[],枚举第3,4列算出总和s2[]. ...

  2. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  3. LeetCode简单题之二分查找

    题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...

  4. 二分查找模板全面总结

    二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...

  5. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  6. 二分查找算法的一点改进

    在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...

  7. 二分法:二分查找(递归+非递归)实现

    二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...

  8. python数据结构与算法:二分查找

    二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...

  9. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作

    目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...

最新文章

  1. 什么决定了电商双11大促的成败
  2. 计算机c盘隐藏了怎么办,win7怎么隐藏c盘 win7c盘被隐藏了怎么解除
  3. JavaScript重难点解析4(作用域与作用域链、闭包详解)
  4. OracleXE安装完成后 http://127.0.0.1:8080/apex 总是在刷新无法打开
  5. Java 字符串格式化 String.format()
  6. 自定义Dialog的小实战——根据地区选择手机号码前缀
  7. 解决Unity中文显示乱码问题
  8. 8.10.3 熊猫分布密度制图
  9. Python 各种画图
  10. git push you are not allowed to upload merges
  11. 第2章 构建自定义语料库
  12. linux 误删文件恢复
  13. JAVA计算机毕业设计高校教材征订管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  14. HTML 动态背景
  15. 线性回归 | Kaggle案例 预期寿命影响预期寿命的因素的统计分析(基于torch)
  16. 能被9和11整除的数的特征
  17. html2Canvas 边框虚线
  18. FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'D:/tjn/tra
  19. SQL Server搭配SSMS基础操作
  20. 淮北师范大学的计算机类怎么分专业,2018淮北师范大学专业排名及分数线 王牌专业有哪些...

热门文章

  1. 如何用一个U盘中装多个iso安装镜像包让一个U盘当N个启动盘,用U盘做一个虚拟光驱可以选择ISO载入到虚拟光驱,多系统启动U盘解决方案
  2. 数据采集中间件技术对比V1.0
  3. 数据分析面试经验(给自己一个梳理的过程)
  4. 精华分享,《这样读书就够了》让知识为你所用
  5. postfix端口修改linux下发送email的smtp端口unbuntu
  6. 2021-07-19 织梦仿站篇_织梦标签生成器讲解
  7. 计算机课逃一节,最想逃的课_厦门工学院
  8. 永磁同步电机(PMSM)控制中为什么要Id=0?还有其他的控制方法吗?
  9. 【经验整理.01】Xilinx网站资源导读 ISE11版
  10. 复制 PDF 时去掉换行符