• 贝壳:特殊的测试(暴力,贪心)


    1. 题目描述

    特殊的测试
    时间限制:C/C++语言 1000MS;其他语言 3000MS
    内存限制:C/C++语言 131072KB;其他语言 655360KB
    题目描述:
    小C在做一种特殊的服务器负载测试,对于一个请求队列中的请求,每一个请求都有一个负荷值,为了保证服务器稳定,请求队列中的请求负荷必须按照先递增后递减的规律(仅递增,仅递减也可以),比如[ 1,2,8,4,3 ],[ 1,3,5 ]和[ 10 ]这些是满足规律的,还有一些不满足的,比如[ 1,2,2,1 ],[ 2,1,2 ]和[ 10,10 ]。现在给你一个请求队列,你可以对请求的负荷值进行增加,要求你调整队列中请求的负荷值,使数组满足条件。最后输出使队列满足条件最小的增加总和。
    
    输入
    输入有两行,第一行是N (1≤n≤5000) ,代表请求队列中的请求数量。
    
    第二行有N个数字 a1,a2…an  (1≤ai≤10^9)。Ai是第i个请求的负荷值。
    
    输出
    输出这个最小增加总和
    
    
    样例输入
    5
    1 4 3 2 5
    样例输出
    6
    
    提示
    样例解释,此时合法队列为[1,4,5,6,5],最小增加和为6

    代码

    方法1 AC 72%

    import java.util.Scanner;
    public class Main {
        private static int N;//正整数个数
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            N = sc.nextInt();
            sc.nextLine();
            int [] val = new int[N];//正整数
            String[] str = sc.nextLine().split(" ");
            for (int i = 0; i < N; i++) {
                val[i] =  Integer.valueOf(str[i]);
            }
            if(N==1){
                System.out.println(0);
                return;
            }
            int left = 0;
            int right = N-1;
            int sum = 0;
            for (int i = 0; i < N-1; i++) {
                if(val[i]<val[i+1]){
                    left++;
                }else{
                    break;
                }
            }
            left++;
            for (int i = N-1; i > 0; i--) {
                if(val[i]<val[i-1]){
                    right--;
                }else{
                    break;
                }
            }
            right--;
            if(right< left){
                if(right==left-1 && val[right]==val[left]){
                    sum = 1;
                }else{
                    sum = 0;
                }
            }else if(right==left){
                sum += (Math.max(val[right-1], val[right+1])- val[right]+1);
            }else{
                while(right>left){
                    if(val[left-1]< val[right+1]){
                        sum += (val[left-1] + 1 - val[left]);
                        left++;
                    }else if(val[left-1]> val[right+1]){
                        sum += (val[right+1] + 1 - val[right]);
                        right--;
                    }else{
                        sum += (val[left-1] + 1 - val[left]);
                        left++;
                        sum += (val[right+1] + 1 - val[right]);
                        right--;
                    }
                }
                if(right==left){
                    sum += (Math.max(val[right-1], val[right+1])- val[right]+1);
                }
            }
            System.out.print(sum);
        }
    }

    方法二 贪心

    import java.util.Arrays;
    import java.util.Scanner;
    public class A1 {
        private static int N;//正整数个数
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            N = sc.nextInt();
            sc.nextLine();
            long [] val = new long[N];//正整数
            String[] str = sc.nextLine().split(" ");
            for (int i = 0; i < N; i++) {
                val[i] =  Integer.valueOf(str[i]);
            }
            long sum = minSum(N,val);
    
            System.out.print(sum);
        }
    
    
        public static long minSum(int n ,long[] nums) {
            if(n == 1)
                return 0;
            if(n == 2 && nums[0] == nums[1])
                return 1;
            if(n == 2 && nums[0] != nums[1])
                return 0;
         
            long[] temp = Arrays.copyOf(nums, n);
         
            int i = 0;
            while(i < n-1 && nums[i] < nums[i+1])
                i++;
            int j = n-1;
            while(j > 0 && nums[j] < nums[j-1])
                j--;     
         
            while(i < j) {
                if(nums[i] < nums[j]) {
                    if(nums[i+1] < nums[i]+1)
                        nums[i+1] = nums[i] + 1;
                    i++;
                } else {
                    if(nums[j-1] < nums[j]+1)
                        nums[j-1] = nums[j] + 1;
                    j--;
                }
            }
            return Arrays.stream(nums).sum() - Arrays.stream(temp).sum();
        }
    }

    网址:

      https://www.nowcoder.com/discuss/220715?type=0&order=0&pos=2&page=1

      https://www.nowcoder.com/discuss/220718?type=0&order=0&pos=5&page=1

  • 相关阅读:
    PyQt5 -1 最基本的小窗口
    浅谈线段树
    最小生成树问题
    最短路问题
    多重背包问题
    02背包(嘻嘻,完全背包)
    01背包例题
    背包问题(好奇怪)
    关于深搜及广搜
    搜索回溯(第二)
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11333201.html
Copyright © 2020-2023  润新知