【蓝桥杯算法】2026/4/9 贪心+双指针

这道题就是需要分情况讨论:
比如说数组1 2 3 4
nums[l]<nums[r] && nums[l+1]<nums[r-1]
或者
nums[l]>nums[r] && nums[l+1]>nums[r-1]
那么nums[l]和nums[l+1]就可以同增同减,就比单独操作一个节约了很多操作数
如果他们不同号:
nums[l]<nums[r] && nums[l+1]>nums[r-1]
或者
nums[l]>nums[r] && nums[l+1]<nums[r-1]
那就只能操作单个数
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int[] nums=new int[n];
for (int i = 0; i < n; i++) {
nums[i]=sc.nextInt();
}
int l=0;
int r=n-1;
long ans=0;
while(l<r) {
//1 3 1 2 3 4
//4 3 2 1
//3 4 1 2
if(l+1<r-1&&(nums[l]>nums[r])&&(nums[l+1]>nums[r-1])){
int fir=nums[l]-nums[r];
int sec=nums[l+1]-nums[r-1];
if(fir>sec){
ans+=fir;
nums[l]=nums[r];
nums[l+1]=nums[r-1];
l+=2;
r-=2;
continue;
}
if(fir<sec){
ans+=fir;
nums[l]=nums[r];
nums[l+1]-=fir;
l++;
r--;
continue;
}
if(fir==sec){
l++;
r--;
continue;
}
}
//1 2 3 4
//2 1 4 3
else if(l+1<r-1&&(nums[l]<nums[r])&&(nums[l+1]<nums[r-1])){
int fir=Math.abs(nums[l]-nums[r]);
int sec=Math.abs(nums[l+1]-nums[r-1]);
if(fir>sec){
ans+=fir;
nums[l]=nums[r];
nums[l+1]=nums[r-1];
l+=2;
r-=2;
continue;
}
if(fir<sec){
ans+=fir;
nums[l]=nums[r];
nums[l+1]+=fir;
l++;
r--;
continue;
}
if(fir==sec){
l++;
r--;
continue;
}
}
else if(nums[l]==nums[r]){
l++;
r--;
continue;
}
//1 3 2 4
//4 2 3 1
// if(l+1<r-1&&(nums[l]-nums[r])*(nums[l+1]-nums[r-1])<0)
else{
int fir=Math.abs(nums[l]-nums[r]);
ans+=fir;
nums[l]=nums[r];
l++;
r--;
continue;
}
}
System.out.println(ans);
}
}

浙公网安备 33010602011771号