【8595】构造回文数组

因为懒得改格式了所以直接截图原题了

解题思路

这道题要求求最小值,要考虑贪心思路。由于要构建的的是回文数组,并且只能加1,那么我们不妨使用双指针分别从头尾开始,每一次看当前这两个数小的一个数需要加多少才能和大的那个相等,记录至sum数组。最后,再通过查看每一个sum[i]-sum[i-1]的值(因为可以进行区间操作,所以上一个数上升的大小就不用再计了),就能得到最小的操作次数了。

核心代码

双指针处理部分

    for(int i=1,j=n;i<=n,j>=1;i++,j--){
		if(a[i]>=a[j]){
			sum[i]=0;
			sum[j]=a[i]-a[j];
		}
		else{
			sum[i]=a[j]-a[i];
			sum[j]=0;
		}
	}

sum数组处理部分

	long long ret=0;
	for(int i=1;i<=n;i++){
		if(sum[i]>=sum[i-1]){
			ret+=sum[i]-sum[i-1];
		}
	}
2 个赞