CCF认证--相邻数对

问题描述

试题编号: 201409-1
试题名称: 相邻数对
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述

  给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。

输入格式

  输入的第一行包含一个整数n,表示给定整数的个数。
  第二行包含所给定的n个整数。

输出格式

  输出一个整数,表示值正好相差1的数对的个数。

样例输入

6
10 2 6 3 7 8

样例输出

3

样例说明

  值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。

评测用例规模与约定

  1<=n<=1000,给定的整数为不超过10000的非负整数。

思路

利用set来存储,因为所给数据不重复,并且set里面的find()函数是用红黑树实现的,算法复杂度为O(logn),效率很高,因此,所给的代码时间复杂度为O(n*logn)

此外,当a=b+1或者a=b-1时,a是b的相邻数对,b也是a的相邻数对,这样的话,便会重复统计,根据握手定理可知,最终的相邻数对是cnt/2.

代码

#include<iostream>
#include<set>
using namespace std;
int main()
{
	int n;
	cin>>n;
	set<int> myset;
	int temp=0;
	for(int i=0;i<n;i++)
	{		
		cin>>temp;
		myset.insert(temp); 
	}
	set<int>::iterator it=myset.begin();
	int cnt=0;
	for(;it!=myset.end();it++)
	{
		if(myset.find(*it+1)!=myset.end())
		{
			cnt++;
		}
		if(myset.find(*it-1)!=myset.end())
			cnt++;	
	}
	cout<<cnt/2<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/chen1995csdn/article/details/82429098
今日推荐