题目
题目背景
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
题目描述
给出一串正整数数列以及一个正整数 C,要求计算出所有满足A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个正整数 N,C。
第二行,N 个正整数,作为要求处理的那串数。
输出格式
一行,表示该串正整数中包含的满足 A−B=C 的数对的个数。
输入输出样例
代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
long long a[100000000];
long long n = 0;
long long c = 0;
long long sum = 0;
int cmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
long long find1(int x)//找小于等于的
{
long long left = 0;
long long right = n-1;
while (left <= right)
{
long long mid = (left + right) / 2;
if (a[mid] <= x)
{
left = mid + 1;
}
else {
right = mid - 1;
}
}
return left;
}
long long find2(int x)//找小于的
{
long long left = 0;
long long right = n - 1;
while (left <= right)
{
long long mid = (left + right) / 2;
if (a[mid] < x)
{
left = mid + 1;
}
else {
right = mid - 1;
}
}
return left;
}
int main()
{
scanf("%lld %lld", &n, &c);
for (long long i = 0; i < n; i++)
{
scanf("%lld", &a[i]);
}
qsort(a, n, sizeof(long long), cmp);
for (long long i = 0; i < n; i++)
{
sum += find1(a[i] + c) - find2(a[i] + c);
}
printf("%lld", sum);
return 0;
}
总结
相当于找A,用二分将小与等于的减去小于的剩下的就是等于的,也就是要找的,因为返回的是下标,所以相减就是个数,遍历一遍所有的数,最后sum的值就是总个数。