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