UVA 1152 4 Values whose Sum is 0

题意:

  四个集合,要求每个集合中选出一个数字,四个数字相加为0,问四个数字相加为零的次数有几次

分析:

  先把A+B的和存到sum数组里,然后再从中找-(c+b)出现的个数。求长度为n的有序数组a中的数k的个数num:num=upper_bound(a,a+n,k)-lower_bound(a,a+n,k);

代码:

  

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=4005;
int T,n;
int A[maxn],B[maxn],C[maxn],D[maxn],sum[maxn*maxn];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
scanf("%d%d%d%d",&A[i],&B[i],&C[i],&D[i]);
int c=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
sum[c++]=A[i]+B[j];
sort(sum,sum+c);
long long ans=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
ans+=upper_bound(sum,sum+c,-C[i]-D[j])-lower_bound(sum,sum+c,-C[i]-D[j]);
}
}
printf("%lld\n",ans);
if(T)
printf("\n");
}
}
posted @ 2015-11-07 22:46  幻世沉溺  阅读(198)  评论(0编辑  收藏  举报