为了更好的阅读体检,可以查看我的算法学习网
题目提交网址P1411
题目描述
小红拿到了一个数组, 她将这个数组的元素定义为“禁着点”。
小红希望你找到一对正整数
x
x
x和
y
y
y, 满足
x
+
y
=
s
x+y=s
x+y=s且
x
x
x和
y
y
y都不是“禁着点”。你能告诉小红有多少种方案吗?
输入描述
第一行输入一个正整数 n n n , 代表禁着点的数量。
第二行输入n个正整数 a i aᵢ ai,代表每个禁着点。
第三行输入一个正整数 s s s。 1 ≤ n ≤ 200000 , 1 ≤ a i , s ≤ 1 0 9 1≤n≤200000,1≤aᵢ,s≤10⁹ 1≤n≤200000,1≤ai,s≤109,保证每个禁着点都是不相等的。
输出描述
选择的方案数。
示例1
输入
3
123
10
输出
3
说明
可以选择的方案有: <4,6>,<5,5>,<6,4>这三种。
思路
首先可以发现,如果没有”禁着点“,那么所能凑成的x,y的数量为s-1,即x为1到s-1,对应的y为s-1到1。
如果出现禁着点t,那么会导致x不能为t和s-t,对应y不能为s-t和t。所以会使得答案减少2,若同时出现禁着点t和s-t那么所获得的效果是一样的。但是需要考虑特殊点,当t*2==s时,只会使答案减少1。若禁着点大于s,则不会产生任何影响。
代码
n = int(input())
v = list(map(int, input().split()))
st = set()
for i in range(n):
st.add(v[i])
s = int(input())
ans = s - 1
for g in v:
if g < s and g in st: # 当前点是禁着点并且小于s
if g * 2 == s: # 判断是否为只需要减1的特殊点
ans -= 1
else:
ans -= 2
st.discard(g) # 同时减去s和s-t,防止s-t出现重复计算
st.discard(s - g)
print(ans)