4 Values whose Sum is 0

题目链接:https://cn.vjudge.net/problem/UVA-1152

    ——每天在线,欢迎留言谈论。

题目大意:

  给定4个n(1<=n<=4000)元素的集合 A、B、C、D ,从4个集合中分别选取一个元素a, b,c,d。求满足 a+b+c+d=0的对数。

思路:

  直接分别枚举 a,b,c,d ,坑定炸了。我们先枚举 a+b并储存,在B、C中枚举找出(-c-d)后进行比较即可。

亮点:

  由于a+b,中会有值相等的不同组合,如果使用map来存,很遗憾超时(虽然时间限制是9000ms)。

  在一个有序数组求某元素数出现的个数:n = upper_bound(a,a+n,k)-lower_bound(a,a+n,k) ;

C++ AC代码:

 #include <iostream>
 #include <cmath>
 #include <iostream>
 #include <string>
 #include <string.h>
 #include <cstdio>
 #include <algorithm>
 #include <map>
 using namespace std;
 const int INT_INF = 0x3f3f3f3f;
 ;
 typedef long long ll;
 ;
 ][MAXN],sumAB[MAXN*MAXN];
 int main()
 {
     int t;
     cin>>t;
     while(t--)
     {
         memset(numbers,,sizeof(numbers));
         memset(sumAB,INT_INF,sizeof(sumAB));
         ,p2=;
         cin>>n;
         ;i<n;i++)
             ;j<;j++)
                 cin>>numbers[j][i];
         ;i<n;i++)
             ;j<n;j++)
             sumAB[p1++]=numbers[][i]+numbers[][j];
         sort(sumAB,sumAB+p1);
         ;
         ;i<n;i++)
             ;j<n;j++)
         {
             answer+=upper_bound(sumAB,sumAB+p1,-numbers[][i]-numbers[][j])-lower_bound(sumAB,sumAB+p1,-numbers[][i]-numbers[][j]);
         }
         cout<<answer<<endl;
         if(t)
             cout<<endl;
     }
     ;
 }

Java AC代码:

 import java.util.Scanner;
 public class Main {
     static Scanner scn = new Scanner(System.in);

     static final int MAXN = 4100;
     static int[][] numbers = new int[4][MAXN];
     static int[] sumAB = new int[MAXN*MAXN];
     public static void main(String[] args) {
         int t;
         t = scn.nextInt();
         while ((t--) > 0) {
             int n;
             n = scn.nextInt();
             for (int i = 0; i < n; i++) {
                 for (int j = 0; j < 4; j++) {
                     numbers[j][i] = scn.nextInt();
                 }
             }
             int p1 = 0;
             for (int i = 0; i < n; i++) {
                 for (int j = 0; j < n; j++) {
                     sumAB[p1++] = numbers[0][i] + numbers[1][j];
                 }
             }
             Tool.quickSort(sumAB,0,p1-1);
             //输出看看
 //            for (int i = 0; i < p1; i++) {
 //                System.out.print(sumAB[i] + " ");
 //            } //成功
             //开始枚举-c-d
             int answer = 0;
             for (int i = 0; i < n; i++) {
                 for (int j = 0; j < n; j++) {
                     answer += Tool.uppper(sumAB, 0, p1, -numbers[2][i] - numbers[3][j]) - Tool.lower(sumAB, 0, p1, -numbers[2][i] - numbers[3][j]);
                 }
             }
             System.out.println(answer);
             if(t > 0)
                 System.out.println();
         }
         System.exit(0);
     }
 }
 class Tool {
     public static int lower(int[] array, int low, int high, int number) {
         //[low,high)
         int i = low, j = high, m;
         while (i < j) {
             m = i + (j - i) / 2;
             if (array[m] >= number)
                 j = m;
             else
                 i = m+1;
         }
         return i;
     }
     public static int uppper(int[] array, int low, int high, int number) {
         int i = low, j = high, m;
         while (i < j) {
             m = i + (j - i) / 2;
             if (array[m] <= number)
                 i = m+1;
             else
                 j = m;
         }
         return i;
     }
     public static void quickSort(int[] array, int low, int high) {
         if (low < high) {
             int m = partition(array, low, high);
             quickSort(array, low, m-1);
             quickSort(array, m+1, high);
         }
     }
     private static int partition(int[] array, int low, int high) {
         int mNumber = array[low];
         int i = low, j = high;
         while (i < j) {
             while (i < j && array[j] >= mNumber) {--j;}
             array[i] = array[j];
             while (i < j && array[i] <= mNumber) {++i;}
             array[j] = array[i];
         }
         array[i] = mNumber;
         return i;
     }
 }

2017-07-30 11:06:43 -> 2017-07-30 13:45:32

UVA 1152 4 Values whose Sum is 0 (枚举+中途相遇法)(+Java版)(Java手撕快排+二分)的更多相关文章

  1. UVa 1152 4 Values whose Sum is 0

    题意:给出n,四个集合a,b,c,d每个集合分别有n个数,分别从a,b,c,d中选取一个数相加,问使得a+b+c+d=0的选法有多少种 看的紫书,先试着用hash写了一下, 是用hash[]记录下来a ...

  2. UVA - 1152 4 Values whose Sum is 0问题分解,二分查找

    题目:点击打开题目链接 思路:暴力循环显然会超时,根据紫书提示,采取问题分解的方法,分成A+B与C+D,然后采取二分查找,复杂度降为O(n2logn) AC代码: #include <bits/ ...

  3. UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)

    摘要:中途相遇.对比map,快排+二分查找,Hash效率. n是4000的级别,直接O(n^4)肯定超,所以中途相遇法,O(n^2)的时间枚举其中两个的和,O(n^2)的时间枚举其他两个的和的相反数, ...

  4. uva 1152 4 values whose sum is zero ——yhx

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

  5. K - 4 Values whose Sum is 0(中途相遇法)

    K - 4 Values whose Sum is 0 Crawling in process... Crawling failed Time Limit:9000MS     Memory Limi ...

  6. POJ 2785 4 Values whose Sum is 0(想法题)

    传送门 4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 20334   A ...

  7. POJ 2785 4 Values whose Sum is 0

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 13069   Accep ...

  8. 哈希-4 Values whose Sum is 0 分类: POJ 哈希 2015-08-07 09:51 3人阅读 评论(0) 收藏

    4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 17875 Accepted: ...

  9. [poj2785]4 Values whose Sum is 0(hash或二分)

    4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 19322 Accepted: ...

随机推荐

  1. ListView中item定位

    ListView 实现定位特定 item 最近在项目中需要使 ListView 能跳转到特定的 item,查阅文档后,发现 ListView 有以下几种方法可供使用: smoothScrollToPo ...

  2. 根据oracle的主键列生成SQLserver的主键

    根据oracle的主键列生成MsSQLServer的主键列 select 'alter table  ' || cu.table_name ||'  add constraint  '||' PK_' ...

  3. 删除MSSQL中所有表的数据

    CREATE PROCEDURE sp_DeleteAllDataASEXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'EXEC ...

  4. 关于 The &#39;Microsoft.ACE.OLEDB.12.0&#39; provider is not registered on the local machine. 异常处理

    导入Excel在本地环境没有问题,但部署到服务器上后出现异常. 经排查,是系统问题,因为本地是32位系统,而服务器上则是64位系统. 解决方法: 1.打开IIS管理器 2.右击应用程序所在的连接池 3 ...

  5. unity,下面两个协程不等价

    //代码1 IEnumerator A(){ Debug.Log(“hi1”); { yield return new WaitForSeconds(1f); Debug.Log(“hi2”); } ...

  6. 图片生成操作属性导致WP内存溢出解决办法

    在开发的项目中,发现经常会出现异常 “内存溢出,不能再继续执行程序”,通过搜索一些国外的文章,发现原来是由于项目中的图片比较多,而生存操作设为了“内容”.通过设置图片的生成操作为“无”,复制操作为“如 ...

  7. ant—学习记录一

    <?xml version="1.0"?> <project name="helloWorld"> <target name=&q ...

  8. IP地址、子网掩码、默认网关是什么意思?

    (一)  问题解析 001.   问:  IP地址,子网掩码,默认网关,DNS服务器,有什么区别呀?我知道没有IP地址就不能上网,我也知道没设DNS就不能上外网,可它们都有什么功能,有什么区别呢?还有 ...

  9. Javascript高级编程学习笔记(75)—— 表单(3)表单字段

    表单字段 表单作为web应用中不可或缺的一部分,当然也是可以使用原生的 DOM 元素来访问的 除了标准的访问方式之外,每个表单都拥有一个 elements 属性,该属性保存着该表单所有 表单元素 的集 ...

  10. c# 转换成时间类型

    if (rngFound.Value.ToString().Contains("/")) { closingdate = rngFound.Value; } else if (rn ...