【问题描述】给定N个整数Ai以及一个正整数C,问其中有多少对i、j满足Ai-Aj=C。
输入描述:第1行输入两个空格隔开的整数N和C,第2~N+1行每行包含一个整数Ai。
输出描述:输出一个数表示答案。
输入样例:
5 3
2
1
4
2
5
输出样例:
3
满足Ai-Aj=C,即满足Ai=Aj+C。
首先,对序列进行递增排序。把Aj(0≤j<N)依次与Ai(j<i<n)进行循环比较,若Ai=Aj+C,则计数器count加1;若Ai>Aj+C,因为元素是递增排序,所以Ai后续的元素均大于Aj和C相加后的和,因此使用break结束本次循环比较,开始下一次比较。最后返回count。
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
//为了避免排序后造成原序列的相对位置发生改动,这里使用vector容器
int func(vector<int> ve,int C)
{
int count = 0;
sort(ve.begin(),ve.end()-1); //对ve容器进行递增排序
int n = ve.size();
for(int j=0;j<n;j++)
{
for(int i=j+1;i<n;i++)
{
if(ve[i] == ve[j]+C)
count++;
else if(ve[i]>ve[j]+C)
break;
}
}
return count;
}
int main()
{
int n,x;
cin>>n>>x;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
vector<int> ve(a,a+n);
cout<<"\n"<<func(ve,x);
}