概述
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)(补题)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复