#P2058. 差.填空题
差.填空题
题目描述
楠楠在网上刷题,感觉第一题:求两数的和 (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 个整数:已经有序。注意:可能有相同的。
数据范围
5 个数据:N 的范围是[1…1,000]。
5 个数据:N 的范围是[1…100,000]。
所有数据: C 的范围是[1…1,000,000,000], N 个整数中每个数的范围是:[0…1,000,000,000]。
输出格式
一个整数,表示该串数中包含的所有满足 A-B=C 的数对的方案数。
样例
4 1
1 1 2 2
4
完善程序
#include<bits/stdc++.h>
using namespace std;
int x[100002],n,c;
//查找从 x[low] 到 x[high] 范围内,第一个大于等于 a 的数的下标
int search(int low,int high,int a)
{
int mid;
while(__填空(1)__)
{
mid = __填空(2)__;
if(x[mid]>=a)
__填空(3)__;
else
__填空41)__;
}
return __填空(5)__; //不担心找不到,所以直接返回 low
}
int main()
{
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++) scanf("%d",&x[i]);
sort(x+1,x+1+n);
x[n+1] = x[n] + c + 1; // 这个地方很重要,确保 search 函数能找得到,但是新加的这个数又不影响结果
int t1,t2;
long long ans=0;
for(int i=1;i<n;i++)
{
if(x[n]-x[i]<c) break;
t1 = search(i+1,n+1,__填空(6)__);
t2 = search(t1,n+1,__填空(7)__);
ans += __填空(8)__;
}
cout<<ans;
return 0;
}
填空(1):{{ input(1) }}
填空(2):{{ input(2) }}
填空(3):{{ input(3) }}
填空(4):{{ input(4) }}
填空(5):{{ input(5) }}
填空(6):{{ input(6) }}
填空(7):{{ input(7) }}
填空(8):{{ input(8) }}