首先,[1,s]区间,最多只有s−1对数满足条件,例如(1,s−1),(2,s−2),...
然后我们可以将禁止使用的数存到一个集合中,然后遍历这个集合,如果在集合中,找到一对数满足a+b=s,则答案-2
特殊的,当a=b时,答案只需要-1即可
O(n)
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int>vec(n, 0);
unordered_set<int>s;
for (int i = 0; i < n; i++)
cin >> vec[i];
sort(vec.begin(), vec.end());
int sum;
cin >> sum;
int count = 0;
for (int i = 0; i < n; i++) {
if (vec[i] >= sum)
continue;
if (vec[i] > sum / 2)
{
if (s.find(sum - vec[i]) == s.end())
s.insert(sum - vec[i]);
}
else
{
if (s.find(vec[i]) == s.end())
s.insert(vec[i]);
}
}
// 一共种数
int tot = sum - 1;
if (sum % 2 == 0)
{
if (s.count(sum / 2))
cout << tot - 1 - 2 * (s.size() - 1) << endl;
else
cout << tot - 2 * (s.size()) << endl;
}
else
cout << tot - 2 * (s.size()) << endl;
return 0;
}
python代码
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:
if g * 2 == s:
ans -= 1
else:
ans -= 2
st.discard(g)
st.discard(s - g)
print(ans)
Java代码
import java.util.*;
class Main {
public static void main(String[]args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] A = new int[n];
Set<Integer> vst = new HashSet();
for (int i = 0 ; i < n ; i++) {
A[i] = sc.nextInt();
vst.add(A[i]);
}
int s = sc.nextInt();
long res = 0;
for (int a: A) {
if (vst.contains(a)) {
if (a < s) {
if (a >> 1 == s) res -= 1;
else res -= 2;
}
}
vst.remove(a);
vst.remove(s-a);
}
System.out.println(res + s - 1);
}
}
小红在玩一个数学游戏,他出一个正整数s,你需要找出两个正整数x,y相加等于这个数,即x+y==s。但是他觉得这样他简单了,所以他限制了一些数不能使用,即x,y都不能使用禁止的数。现在问你有多少种x,y满足这个条件。
第一行输入一个正整数n,表示限制的个数。
第二行输入n个正整数ai,表示限制该数的使用。
第三行输入一个正整数s。
1≤n≤200000,1≤ai,s≤109,保证每个禁着点都是不相等的。
多少种满足条件的x,y。
输入
4
1 2 3 5
10
输出
2
说明 可以选择的方案有: <4,6>,<6,4>这两种。