您的位置:首页 > 产品设计 > UI/UE

day2 POJ 2785 4 Values whose Sum is 0

2016-07-22 09:43 405 查看
#include"iostream"
#include"algorithm"
using namespace std;
int n,k,l,r,mid,mm,sum=0;
int a[4005],b[4005],c[4005],d[4005];
int p[4005*4005],q[4005*4005];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i]>>b[i]>>c[i]>>d[i];
k=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
p[k++]=a[i]+b[j];
k=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
q[k++]=c[i]+d[j];

sort(q,q+k);

for(int i=0;i<k;i++)
{
l=0; r=k-1;
while(l<=r)
{
mid=(l+r)/2;
if(q[mid]==-p[i]) break;
else if(q[mid]<-p[i]) l=mid+1;
else r=mid-1;
}
if(q[mid]==-p[i])
{
mm=mid;
while(q[mm]==-p[i]&&mm>=0) {sum++; mm--;}
mm=mid;
while(q[mm]==-p[i]&&mm<k) {sum++; mm++;}
sum--;
}

}
cout<<sum<<endl;
return 0;
}


给四个数组要求Ax+Bx+Cx+Dx=0的组数,将AB求和,CD求和,排序CD,之后枚举AB二分查找CD即可,因为要求解组数,而CD中可能存在多个相同项,所以每当在CD中查找成功的时候向左右两个方向遍历CD,如果有相同值那么sum++,别忘了遍历后sum结果-1,因为mid值计算了两次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: