二分贪心-D

xiaoxiao2021-02-27  340

Description

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 x B x C x D are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .

Input

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 input file, your program has to write the number quadruplets whose sum is zero.

Sample Input

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

Hint

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

这道题大致的意思是有A,B,C,D四个数组,里面存了相同数量的数,从每个数组中取出一个数使他们的和为零,并计算这样的组合有几种。我的想法是可以先把C,D两个数组中的数之和先算好存在一个新的数组之中,然后在计算A,B两个数组之和最后将其相加,算出和为零的情况。

下面是我的ac代码:

 

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define MAXN 4002 #define inf 1*e9 using namespace std; int n; int a[MAXN],b[MAXN],c[MAXN],d[MAXN]; int cd[MAXN*MAXN];//c,d中数字的组合方法 void solve() { for(int i=0; i<n; ++i) { for(int j=0; j<n; ++j) { cd[i*n+j]=c[i]+d[j];//枚举c,d数字之和的所有情况 } } sort(cd,cd+n*n); long long res=0; for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) { int addcd=-(a[i]+b[j]);//应该加的数 res+=upper_bound(cd,cd+n*n,addcd)-lower_bound(cd,cd+n*n,addcd); } cout<<res<<endl; } int main() { scanf("%d",&n); for(int i=0; i<n; ++i) { scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]); } solve(); return 0; }<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define MAXN 4002 #define inf 1*e9 using namespace std; int n; int a[MAXN],b[MAXN],c[MAXN],d[MAXN]; int cd[MAXN*MAXN];//c,d中数字的组合方法 void solve() { for(int i=0; i<n; ++i) { for(int j=0; j<n; ++j) { cd[i*n+j]=c[i]+d[j];//枚举c,d数字之和的所有情况 } } sort(cd,cd+n*n); long long res=0; for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) { int addcd=-(a[i]+b[j]);//应该加的数 res+=upper_bound(cd,cd+n*n,addcd)-lower_bound(cd,cd+n*n,addcd); } cout<<res<<endl; } int main() { scanf("%d",&n); for(int i=0; i<n; ++i) { scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]); } solve(); return 0; }

 

转载请注明原文地址: https://www.6miu.com/read-2527.html

最新回复(0)