【题解】差

题目描述

        楠楠在网上刷题,感觉第一题:求两数的和(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个数。

 

输入输出格式

输入格式

        第一行,两个正整数:N,C。

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

 

输出格式

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

 

输入输出样例

输入样例

4 1

1 1 2 2

输出样例

4

说明

数据规模

        50%的数据:N的范围是[1...1000]。

        100%的数据:N的范围是[1...100000]。

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

题解

        当给定a时,满足a+b=c的b是唯一的,我们可以根据这个特性来用尺取法遍历这个区间,从而得出结果。

#include<iostream>
#include<algorithm>
using namespace std;
int n,c,a[100005],b[100005],tn,num;
int main()
{
    cin>>n>>c;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]==0)
        {
            if(tn==0)
            {
                tn++;
            } 
            a[tn]=a[i];
        }
        else if(a[i]>a[tn])
        {
            tn++;
            a[tn]=a[i];
        }
        b[tn]++;
    }
    for(int i=1;i<tn;i++)
    {
        for(int low=i+1,high=tn;;)
        {
            int mid=(low+high)/2;
            if(low>high)
            {
                break;
            }
            else if(a[mid]-a[i]==c)
            {
                num+=b[i]*b[mid];
                break;
            }
            else if(a[mid]-a[i]<c)
            {
                low=mid+1;
            }
            else
            {
                high=mid-1;
            }
        }
    }
    cout<<num;
    return 0;
} 
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10352416.html