zoukankan      html  css  js  c++  java
  • POJ-2785 4 Values whose Sum is 0(折半枚举 sort + 二分)

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

      题意是给你4个数列.要从每个数列中各取一个数,使得四个数的sum为0,求出这样的组合的情况个数.

    其中一个数列有多个相同的数字时,把他们看作不同的数字.

      做法是把前两个数列和的值存在一个数组(A)中 , 后两个数列的和存在另一个数组(B)中 , 数组都为n^2 . 然后将B数组sort一下 , 将A数组遍历 , 二分查找一下B数组中与A数组元素和为0的个数 . 有个注意的点是万一A数组都是0 , 而B数组都为0的情况(还有其他情况) , 那二分只能找到一个与之符合的情况 . 所以可以再找刚好比符合数大的数 , 相减他们的位置, 然后加起来 , 就是答案.

    这里可以用到两个函数lower_bound()和upper_bound() ,都用了二分查找,前面的函数是返回一个数组中大于或等于一个数的位置,后面的是返回大于这个数的位置(不懂的可以Google or baidu一下这两个函数怎么用).

    代码如下:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 const int MAXN = 4010;
     7 typedef long long LL;
     8 
     9 LL a[MAXN] , b[MAXN] , c[MAXN] , d[MAXN];
    10 LL num1[MAXN * MAXN] , num2[MAXN * MAXN];
    11 
    12 int main()
    13 {
    14     int n;
    15     while(~scanf("%d" , &n)) {
    16         for(int i = 0 ; i < n ; i++) {
    17             scanf("%lld %lld %lld %lld" , a + i , b + i , c + i , d + i);
    18         }
    19         int f = 0;
    20         for(int i = 0 ; i < n ; i++) {
    21             for(int j = 0 ; j < n ; j++) {
    22                 num1[f] = a[i] + b[j];
    23                 num2[f++] = c[i] + d[j];
    24             }
    25         }
    26         LL res = 0;
    27         int temp = 0;
    28         sort(num2 , num2 + f);
    29         for(int i = 0 ; i < f ; i++) {
    30             temp = lower_bound(num2 , num2 + f , -num1[i]) - num2;
    31             if(temp < f && num2[temp] + num1[i] == 0) {
    32                 res += upper_bound(num2 , num2 + f , -num1[i]) - num2 - temp;
    33             }
    34         }
    35         cout << res << endl;
    36     }
    37 }
  • 相关阅读:
    linux配置Java环境变量(详细)
    linux下的挂载点和分区是什么关系
    VNC的安装与配置
    Linux下的字符集问题
    Freemarker学习中遇到的问题
    ABAP- INCLUDE Zxxx IF FOUND.
    ABAP读取工单状态 STATUS_READ
    WIN7系统设置wifi
    201702-增强记
    20170301 Excel 分多个sheet 导出
  • 原文地址:https://www.cnblogs.com/Recoder/p/4953961.html
Copyright © 2011-2022 走看看