题目背景
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
题目描述
给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个正整数 N,C。
第二行,N 个正整数,作为要求处理的那串数。
输出格式
一行,表示该串正整数中包含的满足 A−B=C 的数对的个数。
输入输出样例
输入 #1
4 1 1 1 2 3
输出 #1
3
说明/提示
对于 75% 的数据,1≤N≤2000。
对于 100% 的数据,1≤N≤2×10⁵,0≤aᵢ<2³⁰,1≤C<2³⁰。
2017/4/29 新添数据两组
思路: 以 A-B=C 求满足的A-B对数 相当于 以 A-C=B 求满足的B的个数
方法一: 遍历(超时)
n,c = map(int,input().split())
lst0 = list(map(int,input().split()))
lst1 = [0 for i in range(n)]
# print(n,c)
# print(lst0)
for i in range(n):
lst1[i] = lst0[i]-c
# print(lst1)
count = 0
for i in range(n):
for j in range(n):
if lst1[i]==lst0[j]:
count += 1
print(count)
方法二:使用bisect库(二分法节省大量时间)
import bisect
n,c = map(int,input().split())
lst0 = list(map(int,input().split()))
lst0.sort() #此方法用到了二分查找,所以需要先对列表进行排序
lst1 = [0 for i in range(n)]
# print(n,c)
# print(lst0)
for i in range(n):
lst1[i] = lst0[i]-c
# print(lst1)
count = 0
for i in range(n):
# print(lst1[i],end=' ')
x = bisect.bisect_left (lst0,lst1[i])
y = bisect.bisect_right(lst0,lst1[i])
# print(x,y)
count += y-x
print(count)