1. 程式人生 > >UVA-1152-4 Values whose Sum is 0---中途相遇法

UVA-1152-4 Values whose Sum is 0---中途相遇法

鏈接 int a + b ace lis href n) () can

題目鏈接:

https://cn.vjudge.net/problem/UVA-1152

題目大意:

給出4個數組,每個數組有n個數,問有多少種方案在每個數組中選一個數,使得四個數相加為0.

n <= 4000

解題思路:

兩重循環求出a + b的所有情況

兩重循環求出-c - d的所有情況

枚舉a+b的值,在-c-d裏面找相同值的數目即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<string
> 6 #include<cmath> 7 #include<set> 8 #include<queue> 9 #include<map> 10 #include<stack> 11 #include<vector> 12 #include<list> 13 #include<deque> 14 using namespace std; 15 typedef long long ll; 16 const int maxn = 1e6 + 10; 17 const double eps = 1e-6
; 18 const int INF = 1 << 30; 19 int T, n, m; 20 int a[4005], b[4005], c[4005], d[4005]; 21 int ab[16001000], cd[16001000]; 22 int main() 23 { 24 scanf("%d",&T); 25 while(T--) 26 { 27 scanf("%d",&n); 28 for(int i = 0; i < n; i++) 29 { 30 scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
31 } 32 int tot = 0, ans = 0; 33 for(int i = 0; i < n; i++) 34 { 35 for(int j = 0; j < n; j++) 36 { 37 ab[tot] = a[i] + b[j]; 38 cd[tot++] = c[i] + d[j]; 39 } 40 } 41 sort(ab, ab + tot); 42 for(int i = 0; i < tot; i++) 43 ans += upper_bound(ab, ab + tot, -cd[i]) - lower_bound(ab, ab + tot, -cd[i]); 44 cout<<ans<<endl; 45 if(T)cout<<endl; 46 } 47 return 0; 48 }

UVA-1152-4 Values whose Sum is 0---中途相遇法