今天突然想起interviewstreet这个网站,这个网站和其他oj有些不同,每题只要通过一组测试样例就会获得一定的分数,然后按分数的高低进行排名,刚刚看到一题。
链接 https://www.hackerrank.com/challenges/pairs
题意大概是输入n和k,然后是n个数每个数在10^9范围内,计算出有多少对a[i]和a[j]使得a[i]+k = a[j]。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N, K;
cin >> N >> K;
long long *key = new long long[N];
for (int i = 0; i < N; i++)
{
cin >> key[i];
}
sort (key, key+N); //对数组进行排序
int k = 0;
for (int i = 0; i < N; i++)
{
int begin = i+1;
int end = N-1;
int value = key[i] + K;
while(begin <= end) //用二分查找有没有满足条件的
{
int mid = (begin+end)/2;
if (key[mid] < value)
begin = mid + 1;
else if (key[mid] > value)
end = mid - 1;
else
{
k++;
break;
}
}
}
cout << k << endl;
}