码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】差

时间:2019-02-05 09:19:02      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:spl   algo   答案   cout   小朋友   stream   数据   方案   ios   

题目描述

        楠楠在网上刷题,感觉第一题:求两数的和(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;
} 
参考程序

 

【题解】差

标签:spl   algo   答案   cout   小朋友   stream   数据   方案   ios   

原文地址:https://www.cnblogs.com/kcn999/p/10352416.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!