题目描述
给出3个整数集合A B C,每个数据集合中有n个元素,集合中的数有正有负且各不相等,现在分别从A B C中各选出一个元素a b c,使得a+b+c=0。请问一共有多少种组合?
输入
第一行,一个整数n表示每个集合中元素的数量n(n≤2000)
接下来n行,每行是用空格隔开的3个整数(-2^28<a,b,c<2^28),分别表示数据集合A B C中的值
输出
输出一行一个整数,表示使得a+b+c=0的组合数
样例输入 Copy
5 -3 2 5 3 -2 1 0 -4 -1 6 7 -5 10 9 -8
样例输出 Copy
7
提示
一共有7种组合,分别是:
-3 2 1
-3 -2 5
3 2 -5
3 -2 -1
3 -4 1
6 2 -8
10 -2 -8
参考代码:
#include<bits/stdc++.h> using namespace std; const int N=1000005; int n,a[N],b[N],c[N],m,p,s=0; int find(int l,int r){ if(l+1==r) return r; int mid=l+r>>1; if(c[mid]<m) return find(mid,r); else return find(l,mid); } int main(){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d%d",a+i,b+i,c+i); sort(a,a+n); sort(b,b+n); sort(c,c+n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ m=0-a[i]-b[j]; p=find(-1,n); if(c[p]==m) s++; } } printf("%d",s); return 0; }