打赏

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

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

 

posted @ 2019-08-10 22:04  海米傻傻  阅读(417)  评论(0编辑  收藏  举报