c++每次选一个数将它分成两个数求最小操作次数使序列变成非递减序列
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
bool flag = true;
for (int i = 1; i < n; i++) {
if (a[i] % 2 != a[0] % 2) {
flag = false;
break;
}
}
if (!flag) {
cout << -1 << endl;
return 0;
}
sort(a, a + n);
int mid = a[n / 2];
int ans = 0;
for (int i = 0; i < n; i++) {
ans += abs(a[i] - mid);
}
cout << ans << endl;
cout << mid << endl;
return 0;
}
【相关推荐】
由初始大根堆,其根结点就为当前序列的最大值,所以我们就直接拿出来,把它放到数组尾部,就不需要再对它进行排序了,接着选出剩余序列中的最大值,以此类推,经过n-1
次循环,就能把整个序列排好序了。
那么我们来看初始大根堆进行交换后的树(由于9已经是当前序列最大值,这里我们不用再管结点9,所以图中删除了,接着就是需要在下面的这个图里找最大值,往后的循环也是这个过程)
存9的位置锁死,不再参与堆排序,数组为
继续堆排序,形成
根结点8和5交换后再删掉结点8,变成
再按此步骤一直进行堆排序,一直到整棵树只剩根结点结束。
交换+删除后👉
交换+删除后👉
。
。
。
。
。
。【最终数组 】