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

image

这道题就是需要分情况讨论:
比如说数组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);

    }
}
posted @ 2026-04-09 15:48  Jwwind  阅读(29)  评论(0)    收藏  举报