2439-最小化数组中的最大值

Raphael Liu Lv10

给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。

每一步操作中,你需要:

  • 选择一个满足 1 <= i < n 的整数 i ,且 nums[i] > 0
  • nums[i] 减 1 。
  • nums[i - 1] 加 1 。

你可以对数组执行 任意 次上述操作,请你返回可以得到的 nums 数组中 ** 最大值** 最小 为多少。

示例 1:

**输入:** nums = [3,7,1,6]
**输出:** 5
**解释:**
一串最优操作是:
1. 选择 i = 1 ,nums 变为 [4,6,1,6] 。
2. 选择 i = 3 ,nums 变为 [4,6,2,5] 。
3. 选择 i = 1 ,nums 变为 [5,5,2,5] 。
nums 中最大值为 5 。无法得到比 5 更小的最大值。
所以我们返回 5 。

示例 2:

**输入:** nums = [10,1]
**输出:** 10
**解释:**
最优解是不改动 nums ,10 是最大值,所以返回 10 。

提示:

  • n == nums.length
  • 2 <= n <= 105
  • 0 <= nums[i] <= 109

Bold> Problem: 2439. 最小化数组中的最大值

[TOC]

思路

> 这题本质上总sum是不变的,变的只是值的分配。

解题方法

我们可以想到首先把res、total设为num【0】,因为她本质只是一个分配问题,所以我们可以比较res跟total迭代后的结果,即可秒出答案,详细看代码,很简便!!(PS:导入的库只有stido跟math,是有用的,其他的只是我的习惯)

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

#include "stdio.h"
#include <stdbool.h>
#include "stdlib.h"
#include <stdio.h>
#include<math.h>

int max(long long a,long long b){
if(a>b)
return a;
else
return b;

}

int minimizeArrayValue(int* nums, int numsSize){
long long res=nums[0];
long long total=nums[0];
for(int i=1;i<numsSize;i++){
total+=nums[i];
res = max(res, (long long)ceil((double)total / (i + 1)));

}
return (int)res;

}
 Comments