差(二分查找)

题目描述

楠楠在网上刷题,感觉第一题:求两数的和(A+B Problem)太无聊了,于是增加了一题:A-B Problem,难倒了一群小朋友,哈哈。
题目是这样的:给出N个从小到大排好序的整数,一个差值C,要求在这N个整数中找两个数A和B,使得A-B=C,问这样的方案有多少种?
 例如:N=5,C=2,5个整数是:2 2 4 8 10。答案是3。具体方案:第3个数减第1个数;第3个数减第2个数;第5个数减第4个数。 

 

输入

第一行2个正整数:N,C。
第二行N个整数:已经有序。注意:可能有相同的。

 

输出

一个整数,表示该串数中包含的所有满足A-B=C的数对的方案数。

 

 

样例输入

复制样例数据

4  1
1  1  2  2

样例输出

4

 

提示

5个数据:N的范围是[1…1,000]。
5个数据:N的范围是[1…100,000]。

所有数据:
C的范围是[1…1,000,000,000]。
N个整数中每个数的范围是:[0…1,000,000,000]。

这题一开始看到1e9真没想到二分能过(因为我想它再怎么分那1e9的for循环还是要走的,可能是数据水了),最基础的二分跑一遍就行了。

#include<iostream>
using namespace std;
int sum=0;
int num[10000005];
int main(int argc, char const *argv[])
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        sum=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&num[i]);
        }
        for(int k=0;k<n;k++)
        {   
            int c=num[k]+m;
            int i=0,j=n-1;
            while(i<=j)
            {
                int mid=(i+j)/2;
                if(num[mid]==c)
                {
                    sum++;
                    int p=mid-1;
                    while(num[p]==c&&p>=0)
                    {
                        p--;
                        sum++;
                    }
                    p=mid+1;
                    while(num[p]==c&&p<n)
                    {
                        p++;
                        sum++;
                    }
                    break;
                }
                else if(num[mid]>c)
                    j=mid-1;
                else 
                    i=mid+1;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

//最后附上一个最最基础的二分模板。

int dls(int num[],int n,int want_to_find)
{
    int i=0,j=n-1;
    while(i<=j)
    {
        int mid=(i+j)/2;
        if(num[mid]==want_to_find)
        {
            return mid;         //返回下标
        }
        else if(num[mid]>want_to_find)
        {
            j=mid-1;
        }
        else
        {
            i=mid+1;
        }
    }
    return -1;              //如果找不到就返回-1
}

 

posted @ 2018-12-20 15:11  howxcheng  阅读(507)  评论(0编辑  收藏  举报