题目描述
楠楠在网上刷题,感觉第一题:求两数的和(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]。
思路分析:
- 可以用尺取法 不知道尺取法的看这里
- 二分答案 不知道的看这里
- 数组计数 (不做描述)
- 排列组合
其实呢尺取法应该是里面最优的方法了,但代码实现并不友好~~(说的就是我)~~
数组计数的话呢应该会爆空间
so,重点来了,我选择的是 二分答案(二分答案yyds)
代码:
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int n,a[100005],c,ans;
int second(int w,int k)//二分答案标准模板
{
int l=k,r=n,mid;
while(l<=r)
{
mid=(l+r)/2;
if(a[mid]-w<=c)
{
l=mid+1;
}
if(a[mid]-w>c)
{
r=mid-1;
}
}
return r;
}
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++)
cin>>a