Uva1152 4 Values whose Sum is 0
来源:互联网 发布:美国大学gpa算法 编辑:程序博客网 时间:2024/06/07 03:35
Uva1152 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
how many quadruplet (a, b, c, d) ∈ A × B × C × D are such that a + b + c + d = 0. In the following, we
assume that all lists have the same size n.
Input
The input begins with a single positive integer on a line by itself indicating the number of the cases
following, each of them as described below. This line is followed by a blank line, and there is also a
blank line between two consecutive inputs.
The first line of the input file contains the size of the lists n (this value can be as large as 4000).
We then have n lines containing four integer values (with absolute value as large as 2
28) that belong
respectively to A, B, C and D.
Output
For each test case, your program has to write the number quadruplets whose sum is zero.
The outputs of two consecutive cases will be separated by a blank line.
Sample Input
1
6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45
Sample Output
5
Sample Explanation: Indeed, the sum of the five following quadruplets is zero: (-45, -27, 42, 30),(26, 30, -10, -46), (-32, 22, 56, -46), (-32, 30, -75, 77), (-32, -54, 56, 30).
Solution
这道题若是我们直接枚举,时间复杂度达到O(n^4)显然不可行。因此我们可以考虑折半枚举(中途相遇法),即:每次先用hash表记录前两个集合中ai+bj的和,然后用hash表判断后两个集合中是否存在ck+dj=-ai-bj
- 代码
#include <vector>#include <cstdio>#include <cstdlib>using namespace std;const int Inf = 2147483647;const int maxn = 4005, maxl = 100987, maxs = 4001 * 4001;vector <int> Hash[maxl];int s[5][maxn], n, t, ans;inline int read(){ char c; do { c = getchar(); }while(c < '0' || c > '9'); int sum = 0; do { sum = sum * 10 + c - 48; c = getchar(); }while(c >= '0' && c <= '9'); return sum;}inline int abs(int a){ if(a > 0) return a; return -a;}inline void push(int x){ Hash[abs(x) % maxl].push_back(x);}inline int search(int x){ int i, k = abs(x) % maxl; int sz = Hash[k].size(), sum = 0; for(i = 0; i < sz; i++) if(Hash[k][i] == x) sum++; return sum;}int main(){ freopen("input.in", "r", stdin); freopen("output.out", "w", stdout); register int i, j; scanf("%d", &t); for(int k = 1; k <= t; k++) { for(i = 0; i < maxl; i++) //记得将hash表清0 Hash[i].clear(); scanf("%d", &n); for(j = 1; j <= n; j++) for(i = 1; i <= 4; i++) scanf("%d", &s[i][j]); for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) push(s[1][i] + s[2][j]); ans = 0; for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) ans += search(-s[3][i] - s[4][j]); printf("%d\n", ans); if(k < t) printf("\n"); } return 0;}
- UVA1152-4 Values whose Sum is 0
- UVa1152 - 4 Values whose Sum is 0
- UVA1152 4 Values whose Sum is 0
- Uva1152 4 Values whose Sum is 0
- UVa1152 - 4 Values whose Sum is 0(hash)
- [Hash思想]UVa1152 - 4 Values whose Sum is 0
- Uva1152——4 Values whose Sum is 0
- 【UVa1152】4 Values whose Sum is 0 模拟
- 解题报告 之 UVA1152 4 Values Whose Sum is Zero
- UVA1152:4 Values whose Sum is 0(和为0的4个值)
- uva1152 - 4 Values whose Sum is 0 入门经典II 第八章 例题8-3
- uva1152 4 Values whose Sum is 0(中途相遇法)
- Uva1152 4 Values whose Sum is 0 【中途相遇+二分】【例题8-3】
- UVa1152 4 Values whose Sum is 0 (中途相遇法+二分)
- 4 Values whose Sum is 0 (P2785)
- 4 Values whose Sum is 0
- 4 Values whose Sum is 0
- 2785 4 Values whose Sum is 0
- Android BlueDroid分析: OSI中的List与alloctor的实现分析
- 《硅谷之谜》读书笔记:追求卓越,改变自己
- linux下du查看目录文件夹大小
- 播放网络视频(当Activity的背景)
- 读《技术人员的发展之路》有感
- Uva1152 4 Values whose Sum is 0
- 关于 PHP 表单安全性的重要提示
- ElasticSearch(一):介绍及安装
- android-目录学习
- 2016技术
- 经常使用的一些Maven dependency
- JQuery Mobile
- STL 序列容器之vector
- Leetcode 14. Longest Common Prefix