题目:给你四列数字,每列数字中都选一个数字形成一组数,找出有多少组数字相加为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; }