#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) }}