题目:输入一个n代表n行,每行有四个数分别代表a,b,c,d,然后从n行中选出a,b,c,d各一个使其和为0,输出总共有几组这种数。
解题思路:建立两个数组e[i],f[i],分别存所有a与b的和,c与d的和,然后用sort将f数组排序,后面令e[i]+f[mid]与0比大小若大于0则令上限等于mid-1,反之令下限等于mid+1,直到下限大于上限为止。
细节处理:下限要大于上限时才可以,这时候结果才是对的。
代码:#include<iostream>
#include<algorithm>
using namespace std;
#define N 4001
int a[N],b[N],c[N],d[N],e[N*N],f[N*N];
int main()
{
int i,j,s,m,n,x;
cin>>s;
m=n=x=0;
for(i=0;i<s;i++)
cin>>a[i]>>b[i]>>c[i]>>d[i];
for(i=0;i<s;i++)
for(j=0;j<s;j++)
{
e[m++]=a[i]+b[j];
f[n++]=c[i]+d[j];
}
sort(f,f+n);
for(i=0;i<m;i++)
{
int lp=0,rp=n-1,mid;
while(lp<=rp)
{
mid=(lp+rp)/2;
if(e[i]+f[mid]==0)
{x++;
for(j=mid+1;j<n;j++)
if(e[i]+f[j]==0)
x++;
else
break;
for(j=mid-1;j>=0;j--)
if(e[i]+f[j]==0)
x++;
else
break;
break;
}
else
if(e[i]+f[mid]>0)
rp=mid-1;
else
lp=mid+1;
}
}
cout<<x<<endl;
return 0;
}
感想:判断时等号一定要考虑清楚。