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;
}
原文地址:https://www.cnblogs.com/lifehappiness/p/12826051.html