其他分享
首页 > 其他分享> > CF #743 B. Swaps

CF #743 B. Swaps

作者:互联网

思维题。两种写法,都是很棒的写法。和排序都有关,第一种没有直接排序,但是也有排序的思想。都是利用贪心,缩小了答案的范围。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, mod = 998244353;
int a[N], b[N];
struct node {
    int val, pos;
} a1[N], b1[N];
signed main()
{
    /* ios::sync_with_stdio(0);
    cin.tie(0); */
    int t;
    cin >> t;
    a[0] = 1e9 + 7;
    while(t--) {
        int n;
        scanf("%lld", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%lld", &a[i]);
            a[i] = min(a[i], a[i - 1]);
        }
        for (int i = 1; i <= n; i++) scanf("%lld", &b[i]);
        int num = n;
        int ans = 1e9 + 7;
        for (int i = 1; i <= n; i++) {
            while(b[i] > a[num]) num--;
            ans = min(ans, num + i - 1);
        }
        cout << ans << endl;
    }
    return 0;
}

如果a [ i ] > b [ num ] 的话,那么b [ num ] 之前的数一定无法和 a [ i ] 之后的数进行匹配。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, mod = 998244353;
int b[N];
struct node {
    int val, pos;
    bool operator < (const node &k) const {
        return val < k.val;
    }
} a[N];
signed main()
{
    /* ios::sync_with_stdio(0);
    cin.tie(0); */
    int t;
    cin >> t;
    while(t--) {
        int n;
        scanf("%lld", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%lld", &a[i].val);
            a[i].pos = i;
        }
        for (int i = 1; i <= n; i++) scanf("%lld", &b[i]);
        sort(a + 1, a + 1 + n);
        int ans = 1e9 + 7;
        int num = 1;
        for (int i = 1; i <= n; i++) {
            while(a[i].val > b[num]) num++;
            ans = min(ans, num - 1 + a[i].pos - 1);
        }
        cout << ans << endl;
    }
    return 0;
}

标签:743,Swaps,val,int,CF,pos,num,ans,lld
来源: https://blog.csdn.net/ATXTKS/article/details/120639020