Find Pair
Posted lifehappiness
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Find Pair相关的知识,希望对你有一定的参考价值。
Find Pair
思路
排一下序然后枚举计数就行了,不是挺简单的嘛。
这是我以为能过的代码,没想到(Wrong answer on test 3),还是只能过样例。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N];
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int n;
ll m;
cin >> n >> m;
for(int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + 1 + n);
ll sum = 0;
for(int i = 1; i <= n; i++) {
if(sum + n < m) {
sum += n;
continue;
}
for(int j = 1; j <= n; j++) {
sum++;
if(sum == m) {
cout << a[i] << " " << a[j] << "
";
return 0;
}
}
}
return 0;
}
我们举个简单的例子(1 1 2),如果按照上面的枚举顺序应该是
([1,1][1,1][1,2][1,1][1,1][1,2][1,2][1,2][2,3])
但是真实却是
([1,1][1,1][1,1][1,1][1,2][1,2][1,2][1,2][2,2])
相比应该看出哪里不一样了吧,数组中1连续出现,我们枚举的数对也会连续出现。所以我们改进的办法就是加一个map来计数,这样就可以按照题目要求的顺序得到递增的序列了。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N], n, b[N], m;
ll k;
map<int, int> mp;
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
cin >> n >> k;
m = n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i];
mp[a[i]]++;
}
sort(a + 1, a + 1 + n);
sort(b + 1, b + 1 + m);
m = unique(b + 1, b + m + 1) - (b + 1);
ll sum = 0;
for(int i = 1; i <= m; i++) {
if(sum + (ll)n * mp[b[i]] < k) {
sum += (ll)n * mp[b[i]];
continue;
}
for(int j = 1; j <= n; j++) {
if(k > sum && k <= sum + mp[b[i]]) {
cout << b[i] << " " << a[j] << "
";
return 0;
}
sum += mp[b[i]];
}
}
return 0;
}
以上是关于Find Pair的主要内容,如果未能解决你的问题,请参考以下文章
[Algo] Find Pair with Given Sum
719. Find K-th Smallest Pair Distance
719. Find K-th Smallest Pair Distance
Java Find Closest Pair in Dataset 给出 NullPointerException [重复]
[GeeksForGeeks] Find the largest pair sum in an unsorted array
[GeeksForGeeks] Find if there is a pair with a given sum in a sorted and rotated array.