题目
给n个不重复的数,问有多少数对和等于k
分析
两种方法
- 对于每一个都二分找
- 两头逼近找数对
#include <bits/stdc++.h>
#pragma GCC diagnostic error "-std=c++11"
#define d(x) cout << (x) << endl
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 5e4 + 10;
int k, n;
int a[N];
int find(int l, int r, int num)
{
while(l <= r){
int mid = (l + r) >> 1;
if(num == a[mid])
return 1;
else if(num > a[mid]){
l = mid+1;
}else{
r = mid-1;
}
}
return 0;
}
int main()
{
scanf("%d%d", &k, &n);
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
sort(a, a + n);
int ans = 0;
int tag = 1;
for (int i = 0; i < n - 1; i++){
if(find(i+1, n-1, k-a[i])){
tag = 0;
printf("%d %d\n", a[i], k - a[i]);
}
}
if(tag)
printf("No Solution\n");
return 0;
}
#include <bits/stdc++.h>
#pragma GCC diagnostic error "-std=c++11"
#define d(x) cout << (x) << endl
#define INF 0x3f3f3f3f
#define eps 1e-8
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 5e4 + 10;
int k, n;
int a[N];
int main()
{
scanf("%d%d", &k, &n);
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
sort(a, a + n);
int tag = 1;
int l = 0;
int r = n - 1;
while(l < r){
int mid = a[l] + a[r];
if(mid == k){
printf("%d %d\n", a[l++], a[r--]);
tag = 0;
}else if(mid < k){
l++;
}else{
r--;
}
}
if(tag)
puts("No Solution");
return 0;
}