我是靠谱客的博主 靓丽翅膀,最近开发中收集的这篇文章主要介绍Codeforces Round #737 (Div. 2)(补题),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

B. Moamen and k-subarrays

在这里插入图片描述
在这里插入图片描述
题意: 长度为n的一个数组,让你划分几个子数组,子数组之间可以随意相互交换顺序,问你能否恰好划分k个子数组,使得数组按照非严格递减来排序
思路: 可以按照他们的值进行排序并根据他们排完序后的顺序付一个rank,再还原数组,若两个数之间的rank是连续的,说明可以放在一个子数组中。
也可以二分来做,直接对每个数二分找比他大的数是否是你当前数的下一个数,如果是,说明这两个数是连续的,不是就要归为两个不同的子数组。
也可以记录每个数的前驱来做,和上面原理一样
注意:计数器cnt一定要从1开始,最少1个子数组(一开始没注意,一直wa3)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int n, k;
int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        memset(b, 0, sizeof(b));
        memset(a, 0, sizeof(a));
        scanf("%d%d", &n, &k);
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
            b[i] = a[i];
        }
        sort(b, b + n);
        int cnt = 1;
        for (int i = 1; i < n; i++) {
            if (a[i] < a[i - 1]) {
                cnt++;
            } else {
                if (a[i] == a[i - 1]) continue;
                if (a[i] > a[i - 1]) {
                    int t = upper_bound(b, b + n, a[i - 1]) - b;
                    if (b[t] == a[i])
                        continue;
                    else
                        cnt++;
                }
            }
        }
        if (cnt > k)
            puts("No");
        else
            puts("Yes");
    }
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct node {
    int id;
    int x;
    int rank;
} a[N];
bool cmp1(node a, node b) { return a.x < b.x; }
bool cmp2(node a, node b) { return a.id < b.id; }
int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int n, k;
        memset(a, 0, sizeof(a));
        scanf("%d%d", &n, &k);
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i].x);
            a[i].id = i;
        }
        sort(a, a + n, cmp1);
        int cnt = 1;
        for (int i = 0; i < n; i++) {
            a[i].rank = i;
        }
        sort(a, a + n, cmp2);
        for (int i = 1; i < n; i++) {
            if (a[i].rank - 1 != a[i - 1].rank) {
                cnt++;
            }
        }
        if (cnt <= k)
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}

To be continued
如果你有任何建议或者批评和补充,请留言指出,不胜感激

最后

以上就是靓丽翅膀为你收集整理的Codeforces Round #737 (Div. 2)(补题)的全部内容,希望文章能够帮你解决Codeforces Round #737 (Div. 2)(补题)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部