zoukankan      html  css  js  c++  java
  • 贝壳:特殊的测试(暴力,贪心)

    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

  • 相关阅读:
    spring cloud 和 阿里微服务spring cloud Alibaba
    为WPF中的ContentControl设置背景色
    java RSA 解密
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    Hystrix 配置参数全解析
    spring cloud 2020 gateway 报错503
    Spring Boot 配置 Quartz 定时任务
    Mybatis 整合 ehcache缓存
    Springboot 整合阿里数据库连接池 druid
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11333201.html
Copyright © 2011-2022 走看看