求解满足条件的元素对个数问题

【问题描述】给定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);
}
原创文章 14 获赞 16 访问量 6874

猜你喜欢

转载自blog.csdn.net/qq_37638909/article/details/83542967