各位巨佬给看看,弱化版代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, p[1310], pos[1310],d[1310], tot;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
scanf("%d", &p[i]);
pos[p[i]] = i;
}
pos[n + 1] = 0;
for(int i=1; i<=n-1; i++){
int l=min(pos[i],pos[i+1]),r=max(pos[i],pos[i+1]);
for(int j=l+1; j<=r-1; j++) if(p[j]>i+1) d[i]++;
}
for(int i=n; i>=1; i--) {
tot=tot+abs(pos[i]-pos[i+1])-d[i];
}cout << tot << endl;
for(int i=n; i>=1; i--){
if(pos[i]>pos[i+1]){
for(int j=1; j<abs(pos[i]-pos[i+1])-d[i]; j++) printf("A B\n");
printf("A C\n");
}
else{
for(int j=1; j<abs(pos[i]-pos[i+1])-d[i]; j++) printf("B A\n");
printf("B C\n");
}
}
return 0;
}
还有救吗?(指弱化过了,能不能在这基础上优化一下把强化也给过了) 思路:在原序列中每次找次大值(初始0为最大值,位置为0),找到后移动次数即为最大值与次大值在原数组中的距离,次大值在最大值左侧和右侧分类讨论,分别是A-B和B-A,对应的,最大值的位移为A-C和B-C,删去最大值(在代码中采用了预处理两相邻值之间比较大值大的数的个数,只有这部分为O(n log n),其他部分都为O(n)(蒟蒻不会算时间复杂度,勿喷……),就想知道这一部分怎么优化),如果WA是因为代码正确性有问题,请大佬们指出……