题目大意:有n个数字,k作为跨度,选择一个或多个整数 i ,1 ≤ i ≤ N−K, 然后交换a[ i ]和a[ i + k ],最后使得升序排列。
实现方法:运用取余,取余相同的可以互相无限次交换。取余把数据进行分组,每组都进行排序,之后再还原他们本身的位置,看看总的是不是升序,若不是,那么NO。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxx = 2e5 + 7;
int n, k, a[maxx], b[maxx];
vector <int> vec[maxx];
int main() {
cin >> n >> k;
for(int i = 0; i < n; i++) cin >> a[i];
if(k == 1) {
puts("Yes");
return 0;
}
for(int i = 0; i < n; i++) vec[i % k].push_back(a[i]); //vec第一维是0 ~ k - 1
for(int i = 0; i < k; i++) sort(vec[i].begin(), vec[i].end());
for(int i = 0; i < k; i++) {
for(int j = 0; j < vec[i].size(); j++) b[i + j * k] = vec[i][j];
}
sort(a, a + n);
bool flg = 1;
for(int i = 0; i < n; i++) {
if(a[i] != b[i]) {
flg = 0;
break;
}
}
if(flg) puts("Yes");
else puts("No");
return 0;
}
注意:
1.push_back
2. i % k
3. 把vec[ i ][ j ]的值给b[ i + j * k ] j * k是进行了多少个vec的行,i 是本行的元素下标
sort讲解
#include <bits/stdc++.h>
using namespace std;
int n, a[10];
vector <int> vec;
bool cmp(int x, int y) {
return x > y;
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i++) cout << a[i] << ends;
cout << endl;
for(int i = 1; i <= n; i++) vec.push_back(a[i]);
sort(vec.begin(), vec.end(), cmp);
for(int i = 0; i < vec.size(); i++) cout << vec[i] << endl;
return 0;
}
sort分为三个参数,第一个是起始点,第二个是末点,第三个是方式,默认升序。
bool cmp 插入后可实现倒序排列