这个题其实几乎就是个模拟题,怎么实现希尔排序的思路已经告诉你了,你就按部就班的实现即可
最值得注意的是,这个代价的计算,这个代价是两点间距离 / d + 1,题目中给的有点精简了,不过这个题确实就这个点值得思考,其他的对着思路打就行
以下是AC代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define int int64_t
using namespace std;
int n, m,cost,sum;
int a[100005];
signed main() {ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);cin >> n >> m;for (int i = 1; i <= n; ++i) cin >> a[i];for (int i = 1; i <= m; ++i) {int d; cin >> d;for (int j = 1; j <= d; j++) {//枚举起点cost = 0;for (int k = j; k <= n; k += d) {//枚举元素int t = k;while (t > j && a[t] < a[t - d]) { swap(a[t], a[t - d]); t -= d; }cost += (k - t) / d + 1;}sum += cost;}}cout << sum << endl;for (int i = 1; i <= n; ++i)cout << a[i] << " ";cout << endl;return 0;
}