问题描述
试题编号: | 201409-1 |
试题名称: | 相邻数对 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。 输入格式 输入的第一行包含一个整数n,表示给定整数的个数。 输出格式 输出一个整数,表示值正好相差1的数对的个数。 样例输入 6 样例输出 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; }