【备战秋招】每日一题:2023.07.29-科大讯飞-开发岗-第三题-塔子哥的数学游戏

为了更好的阅读体检,可以查看我的算法学习网
题目提交网址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⁹ 1n200000,1ai,s109,保证每个禁着点都是不相等的。

输出描述

选择的方案数。

示例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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值