如何优化(求调)
查看原帖
如何优化(求调)
286400
Asad楼主2023/7/10 13:14

各位巨佬给看看,弱化版代码:

#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是因为代码正确性有问题,请大佬们指出……

2023/7/10 13:14
加载中...