禁着点的方案数--科大讯飞笔试

小红拿到了一个数组, 她将这个数组的元素定义为“禁着点”。小红希望你找到一对正整数x和y,满足x+y=s且x和y都不是“禁着点’。你能告诉小红有多少种方案吗?

输入描述

第一行输入一个正整数n,代表禁着点的数量。

第二行输入n个正整数ai,代表每个禁着点。

第三行输入一个正整数s。1<=n<=200000,1<=ai,s<=10^9,保证每个禁着点都是不相等的。

输出描述

选择的方案数

示例

输入

3
1 2 3
10

输出

3

思路

假设没有禁着点,则x+y=s的方案一共有s-1种,那么我们只需要计算禁着点排除掉的方案即可。

我们遍历禁着点,如果这个点是s的一半,则减少一种方案,否则减少两种方案

最后总方案减去禁着点的方案即可

代码

n = int(input())
a = list(map(int,input().split()))
s = int(input())

myset = set(a)
for i in range(len(a)):
    myset.add(s-a[i])

sub = 0
for i in range(len(a)):
    if a[i] in myset:
        if s>>1 == a[i]:
            sub-=1
        else:
            sub-=2

    myset.remove(a[i])
    myset.remove(s-a[i])

print(s-1+sub)

你可能感兴趣的:(算法,算法)