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

poj 2785 4 Values whose Sum is 0

2013-11-15 10:18 375 查看
这题要运用二分法。一共有4列数,前两列分一组,后两列分一组。把第一列每个数和第二列每个数相加形成一个新的数组apb[n*n],把第三列每个数和第四列每个数相加形成数组cpd[n*n],把apb[ ]进行从小到大排序。从cpd[ ]的第一个数开始二分查找apb[ ]中有没有符合相加之和为0的。

注意:

1.注意2^28用int就足够了。

2. 排序之后可能有值相同的情况,所以当apb[ ]+cpd[ ]=0的时候要考虑apb数组中当前位置下的前面数和后面的数是否同样满足满足apb[ ]+cpd[ ]=0。

3.mid+1/-1。eg 当前mid=4;high=5.下一步要让mid=5,但是因为mid low high都是整型,所以下一步mid=(4+5)/2还是4,这样就死循环了,所以mid要为4+1。

 

#include <stdio.h>
#include <stdlib.h>
int a[4010],b[4010],c[4010],d[4010];
int apb[4000*4000+10],cpd[4000*4000+10];
int cmp(void const *a,void const *b)
{
return ((*(int *)a>*(int *)b)?1:-1);
}
int main()
{
int n,i,j,low,high,mid,ans,k;
scanf("%d",&n);
for(i=0; i<n; i++)
scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
apb[i*n+j]=a[i]+b[j];
cpd[i*n+j]=c[i]+d[j];
}
}
qsort(apb,n*n,sizeof(int),cmp);
for(i=0; i<n*n; i++)
ans=0;
for(i=0; i<n*n; i++)
{
high=n*n-1;
low=0;
mid=(high+low)/2;
while(low<high)
{
if(cpd[i]+apb[mid]>0)
high=mid-1;
else if(cpd[i]+apb[mid]<0)
low=mid+1;
mid=(high+low)/2;
if(cpd[i]+apb[mid]==0)
{
ans++;
for(k=mid-1; k>=0; k--)
{
if(apb[k]+cpd[i]==0)
ans++;
else break;
}
for(k=mid+1; k<n*n; k++)
{
if(apb[k]+cpd[i]==0)
ans++;
else break;
} break;
}
}
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: