You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.1 KiB
68 lines
2.1 KiB
/*
|
|
多多有一个长度为n的数组,依次采用如下策略对数组从小到大进行排序
|
|
1.将数组划分为k个非空子串(每个子串为原数组中连续数字组成的子序列)
|
|
2.调整k个子串的顺序,每个子串内元素顺序不变
|
|
3.将k个子串首尾相连,组成一个新的数组
|
|
|
|
以上策略不保证最终得到的数组有(单调递增)请你计算一下,对于给定的数组与划分数k,能否最终得到一个有序递增的序列
|
|
|
|
输入描述:
|
|
第一行一个数字T(T < 5),代表测试用例个数
|
|
对于每组测试用例:第一行两个数字:n,k,代表数组长度与划分子串个数,0<k<n<1e5
|
|
第二行n个数字a1,a2,…,an,0≤|ai|;≤ 1e14,保证数组内元素各不相同
|
|
|
|
输出描述:
|
|
对于每个测试用例,如果能够得到有序序列,输出“Tue"(不含引号),否则输出“False(不含引号)
|
|
|
|
示例:
|
|
输入:
|
|
3
|
|
5 3
|
|
8 12 7 -6 5
|
|
4 2
|
|
2 3 -6 4
|
|
5 5
|
|
10 6 8 -5 -10
|
|
输出:
|
|
True
|
|
False
|
|
True
|
|
|
|
思路 排序的同时也对原来的需要排序,然后判断块应该分割的次数,如果小于等于K则可以
|
|
*/
|
|
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
int main(){
|
|
ios::sync_with_stdio(false);
|
|
cin.tie(0);
|
|
int T;
|
|
cin >> T;
|
|
while(T--){
|
|
long long n, k;
|
|
cin >> n >> k;
|
|
vector<long long> arr(n);
|
|
for(auto &x : arr)cin >> x;
|
|
//Create a vector of pairs(value, original index)
|
|
vector<pair<long long, long long>> sorted_arr(n);
|
|
for(long long i = 0; i < n; i++){
|
|
sorted_arr[i] = {arr[i], i+1};//1-based indexing
|
|
}
|
|
// Sort the array based on values
|
|
sort(sorted_arr.begin(), sorted_arr.end());
|
|
// Count the number of blocks where indices are consecutive
|
|
long long m = 1;// At least one block
|
|
for(long long i = 1; i < n; i++){
|
|
if(sorted_arr[i].second != sorted_arr[i-1].second +1){
|
|
m++;
|
|
}
|
|
}
|
|
// If number of blocks <=k, it's possible
|
|
if(m <= k){
|
|
cout <<"True\n";
|
|
}
|
|
else{
|
|
cout<<"False\n";
|
|
}
|
|
}
|
|
}
|