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代码:

  1. #include <iostream>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <string>
  5. #include <string.h>
  6. #include <cstdio>
  7. #include <algorithm>
  8. #include <map>
  9. using namespace std;
  10. const int INT_INF = 0x3f3f3f3f;
  11. const double EPS = 1e-;
  12. typedef long long ll;
  13. const int MAXN = 4e3+;
  14. int numbers[][MAXN],sumAB[MAXN*MAXN];
  15. int main()
  16. {
  17. int t;
  18. cin>>t;
  19. while(t--)
  20. {
  21. memset(numbers,,sizeof(numbers));
  22. memset(sumAB,INT_INF,sizeof(sumAB));
  23. int n,p1=,p2=;
  24. cin>>n;
  25. for(int i=;i<n;i++)
  26. for(int j=;j<;j++)
  27. cin>>numbers[j][i];
  28. for(int i=;i<n;i++)
  29. for(int j=;j<n;j++)
  30. sumAB[p1++]=numbers[][i]+numbers[][j];
  31. sort(sumAB,sumAB+p1);
  32. int answer=;
  33. for(int i=;i<n;i++)
  34. for(int j=;j<n;j++)
  35. {
  36. answer+=upper_bound(sumAB,sumAB+p1,-numbers[][i]-numbers[][j])-lower_bound(sumAB,sumAB+p1,-numbers[][i]-numbers[][j]);
  37. }
  38. cout<<answer<<endl;
  39. if(t)
  40. cout<<endl;
  41. }
  42. return ;
  43. }

Java AC代码:

  1. import java.util.Scanner;
  2. public class Main {
  3. static Scanner scn = new Scanner(System.in);
  4.  
  5. static final int MAXN = 4100;
  6. static int[][] numbers = new int[4][MAXN];
  7. static int[] sumAB = new int[MAXN*MAXN];
  8. public static void main(String[] args) {
  9. int t;
  10. t = scn.nextInt();
  11. while ((t--) > 0) {
  12. int n;
  13. n = scn.nextInt();
  14. for (int i = 0; i < n; i++) {
  15. for (int j = 0; j < 4; j++) {
  16. numbers[j][i] = scn.nextInt();
  17. }
  18. }
  19. int p1 = 0;
  20. for (int i = 0; i < n; i++) {
  21. for (int j = 0; j < n; j++) {
  22. sumAB[p1++] = numbers[0][i] + numbers[1][j];
  23. }
  24. }
  25. Tool.quickSort(sumAB,0,p1-1);
  26. //输出看看
  27. // for (int i = 0; i < p1; i++) {
  28. // System.out.print(sumAB[i] + " ");
  29. // } //成功
  30. //开始枚举-c-d
  31. int answer = 0;
  32. for (int i = 0; i < n; i++) {
  33. for (int j = 0; j < n; j++) {
  34. answer += Tool.uppper(sumAB, 0, p1, -numbers[2][i] - numbers[3][j]) - Tool.lower(sumAB, 0, p1, -numbers[2][i] - numbers[3][j]);
  35. }
  36. }
  37. System.out.println(answer);
  38. if(t > 0)
  39. System.out.println();
  40. }
  41. System.exit(0);
  42. }
  43. }
  44. class Tool {
  45. public static int lower(int[] array, int low, int high, int number) {
  46. //[low,high)
  47. int i = low, j = high, m;
  48. while (i < j) {
  49. m = i + (j - i) / 2;
  50. if (array[m] >= number)
  51. j = m;
  52. else
  53. i = m+1;
  54. }
  55. return i;
  56. }
  57. public static int uppper(int[] array, int low, int high, int number) {
  58. int i = low, j = high, m;
  59. while (i < j) {
  60. m = i + (j - i) / 2;
  61. if (array[m] <= number)
  62. i = m+1;
  63. else
  64. j = m;
  65. }
  66. return i;
  67. }
  68. public static void quickSort(int[] array, int low, int high) {
  69. if (low < high) {
  70. int m = partition(array, low, high);
  71. quickSort(array, low, m-1);
  72. quickSort(array, m+1, high);
  73. }
  74. }
  75. private static int partition(int[] array, int low, int high) {
  76. int mNumber = array[low];
  77. int i = low, j = high;
  78. while (i < j) {
  79. while (i < j && array[j] >= mNumber) {--j;}
  80. array[i] = array[j];
  81. while (i < j && array[i] <= mNumber) {++i;}
  82. array[j] = array[i];
  83. }
  84. array[i] = mNumber;
  85. return i;
  86. }
  87. }

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(中途相遇法)

    题意:从四个集合各选一个数,使和等于0,问有多少种选法. 分析:求出来所有ai + bi,在里面找所有等于ci + di的个数. #pragma comment(linker, "/STAC ...

  2. UVa 1152 -4 Values whose Sum is 0—[哈希表实现]

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

  3. 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 ...

  4. UVA - 1152 --- 4 Values whose Sum is 0(二分)

    问题分析 首先枚举a和b, 把所有a+b记录下来放在一个有序数组,然后枚举c和d, 在有序数组中查一查-c-d共有多少个.注意这里不可以直接用二分算法的那个模板,因为那个模板只能查找是否有某个数,一旦 ...

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

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

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

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

  7. 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 ...

  8. 【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)

    题意:给定4个N元素几个A,B,C,D,要求分别从中选取一个元素a,b,c,d使得a+b+c+d=0.问有多少种选法.(N≤4000,D≤2^28) 解法:首先我们从最直接最暴力的方法开始思考:四重循 ...

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

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

随机推荐

  1. VP9 vs H.265——下一代视频编码标准的王道之争

    目前下一代主流的视频编码标准有 ITU-T VCEG 推出来的 H.265 和 Google 推出 VP9 . H.265 在 H.264 的基础上保留其中的部分技术,并对相关技术加以改进研发而成.新 ...

  2. Django - 数据按年月日查找

    views from django.db.models.functions import TruncMonth,TruncYear # 查询当前站点每个月份下的文章数 # time_count=mod ...

  3. cp2102 驱动 win7x64 -2018

    试了好多种网上的驱动,都不行,要么是报错要么是安装没反应 之后意外遇见驱动官网?里面真全 url:https://www.silabs.com/products/development-tools/s ...

  4. 剑指offer例题分享--4

    前言:搁置许久的更新要继续开始了!前一段时间一直在忙项目和C++的学习,所以搁置了!要改变注意了,要用C++进行编写了,因为要不断练习C++! 面试题15: 书中要求只能遍历链表一次,所以代码如下: ...

  5. sudo的使用和配置

    1 sudo是什么 Sudo是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的“权利”,让他们执行一些只有超级用户或其他特许用户才能完成的任务,比如:运行一些像 ...

  6. MyBatis源码解析(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...

  7. awk知识点总结

    find+xargs+grep+sed+awk系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 0.学习资料推荐 1.awk入门:看视频.找 ...

  8. Perl检查引用类型

    有时候可能会需要检查引用是什么类型的,免得我们期待是一个数组引用,却给了一个hash引用. ref函数可以用来检查引用的类型,并返回类型.perl中内置了如下几种引用类型,如果检查的不是引用,则返回u ...

  9. MySQL优化(2)--------常用优化

    前言 之前已经简单介绍了MySQL的优化步骤,那么接下来自然而是就是常用的SQL优化,比如inseer.group by等常用SQL的优化,会涉及SQL语句内部细节(这正是我缺乏的).最后希望自己能记 ...

  10. 设置TabWidget的样式的方法、关联Fragment与tabwidget的方法、点击tab显示相应Fragment方法

    private void updateTabHost(TabHost tabHost) { int count = tabHost.getTabWidget().getChildCount(); ; ...