poj2785(二分)

版权声明:仅供研究,转载请注明出处。 https://blog.csdn.net/CSUstudent007/article/details/82147921

思路:

将前两个数组的数加起来(ab),后两个数组数加起来(cd),然后枚举ab的值,二分cd的数进行判断。

ps:如果cd找到与ab相符合的数

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[4001],b[4001],c[4001],d[4001];
int ab[4000*4000+1],cd[4000*4000+1];
int k2;
int check(int x)
  {
     int left=1,right=k2-1,mid;
     while (left<=right)
     {
         mid=(left+right)/2;
         if (x==cd[mid])
         {
             int w=0,e=mid;
             while (x==cd[e]&&e<k2)
                 e++,w++;
             e=mid-1;
             while (x==cd[e]&&e>0)
                 e--,w++;
             return w;
         }
         else if (x<cd[mid])
             right=mid-1;
         else
             left=mid+1;
     }
     return 0;
 }
int main()
 {
     int t,i,j,q;
     while (~scanf("%d",&t))
     {
         for (i=1;i<=t;i++)
             scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
         memset(ab,0,sizeof(ab));
         memset(cd,0,sizeof(cd));
         int k1=1,sum=0;
         k2=1;
         for (i=1;i<=t;i++)
         {
             for (j=1;j<=t;j++)
             {
                 ab[k1++]=a[i]+b[j];
                 cd[k2++]=-(c[i]+d[j]);
             }
         }
         sort(cd+1,cd+k2);
         for (i=1;i<k1;i++)
             sum+=check(ab[i]);
         printf("%d\n",sum);
     }
     return 0;
 }

猜你喜欢

转载自blog.csdn.net/CSUstudent007/article/details/82147921
今日推荐