题目:给你四列数字,每列数字中都选一个数字形成一组数,找出有多少组数字相加为0
思路:二分查找
将两列的数字的和存到一个数组中
再看下两列数字的和是否存在上两列数字的相反数(即相加等于0)
利用二分查找从而达到目的
AC代码:

#include <iostream>
#include <algorithm>
using namespace std;
int a[4010]={0},b[4010];
int sum[16000010];
int c[4010],d[4010];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i]>>b[i]>>c[i]>>d[i];
    }
    int k=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            sum[k++]=a[i]+b[j];//存储前两列的和
        }
    }
    sort(sum,sum+k);//先排序
    long long ans=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
        int  x=-(c[i]+d[j]);//看后两列的相反数是否在前两列中
        ans+=upper_bound(sum,sum+k,x)-lower_bound(sum,sum+k,x);//找到第一个出现数字的下标与最后一个相同出现数字的下标+1的差便能找出该数字对应多少个前两列的和
        }
    }
    cout<<ans;
    return 0;
}