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. 朴素贝叶斯算法的python实现

    朴素贝叶斯 算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 朴素贝叶斯比如我们想判断一个邮件是不是垃圾邮件,那么 ...

  2. React Native 中组件的生命周期

    概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命 ...

  3. libtiff 生成48位色tif图片

    BOOL CTifImage_48Bits::BitmapConvertTo48BitsTif(CString strImagePath, int nWidth, int nHeight, int n ...

  4. django Forgienkey字段 在前台用js做处理

    在我做的项目中有个选择省城市的选项,这两个字段的关系是一对多的关系class Province(models.Model): # 省会      name = models.CharField(max ...

  5. SQL语句AND 和 OR执行的优先级

    例句: ) FROM RT_CUSTALLOCRESULT WHERE REGDATE BETWEEN '2014-03-01' AND '2014-03-31' ) FROM RT_CUSTALLO ...

  6. C# 操作 Excel 常见问题收集和整理

    C# 操作 Excel 常见问题收集和整理(定期更新,欢迎交流) 经常会有项目需要把表格导出为 Excel 文件,或者是导入一份 Excel 来操作,那么如何在 C# 中操作 Excel 文件成了一个 ...

  7. package.json 里 devDependencies和dependencies的区别

    我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev --save 在 package.json 文件里面 ...

  8. python之数据库(mysql)操作

    前言: 最近开始学django了,学了下web框架,顿时感觉又会了好多知识.happy~~ 这篇博客整理写下数据库基本操作,内容挺少.明天写SQLAlchemy. 一.数据库基本操作 1. 想允许在数 ...

  9. adesk上架实施--VDC详细配置(深信服论坛转)

    1.建立独享桌面资源   1.1通过https://VDCIP:4430登录控制台,VDI设置-->资源管理-->新建独享桌面资源 1.2点击新建,独享桌面资源后显示如下界面 配置完后,往 ...

  10. OpenWRT(RT5350) 路由客户模式(Routed Client) ,设置防火墙开放UDP指定端口

    /* *功     能: 本文主要功能是设置OpenWRT(RT5350) 系统实现路由客户模式,无线连接上级路由, * 无线释放AP客户端,实现伪装的中继(子网段与上级路由网段不同),同时更改防火墙 ...