【题目描述】
给出一个长为
�
n的数列
�
1
,
�
2
,
⋯
,
�
�
a
1
,a
2
,⋯,a
n
。你可以进行以下操作最多
�
k次:
选择一个下标
1
≤
�
≤
�
1≤i≤n,将
�
�
,
�
�
+
1
,
⋯
,
�
�
a
i
,a
i+1
,⋯,a
n
的值都增加
�
i。
经过最多
�
k次操作后,数列中最小的数的值为
�
m。那么通过选择合适的操作方式,
�
m可以达到的最大值是多少?
【输入格式】
第1行,2个整数
�
,
�
n,k。
第2行,
�
n个整数
�
1
,
�
2
,
⋯
,
�
�
a
1
,a
2
,⋯,a
n
。
【输出格式】
输出
�
m可以达到的最大值。
【输入输出样例#1】
输入#1
5 2
3 4 2 1 0
复制
输出#1
4
复制
【输入输出样例#2】
输入#2
1 1000000000
100000000000000
复制
输出#2
100001000000000
复制
【输入输出样例#3】
输入#3
10 100
901 780 604 576 569 569 515 488 379 100
复制
输出#3
724
复制
【输入输出样例#4】
输入#4
3 0
0 0 0
复制
输出#4
0
引用chatGPT作答,算法思路:
本题最优解可以采用二分法进行查找,我们假设最优解的区间是$[l,r]$,并且我们定义$check(x)$表示,通过最多$k$次操作后,数列中最小的数可以达到$x$。那么我们可以通过比较区间的中间值$m=(l+r)/2$与$check(m)$的值的大小来判断最优解在哪一个区间。
算法步骤:
1.定义二分区间$[l,r]$,其中$l$表示原数列中的最小值,$r$表示原数列中的最大值+最大操作数*k。
2.定义$check(x)$函数,表示通过最多$k$次操作后,数列中最小的数可以达到$x$的布尔值。
3.使用二分法找到最优解的区间$[l,r]$,具体步骤如下:
4.每次将区间中点的值$m=(l+r)/2$作为参数传入$check(m)$函数中。
5.如果$check(m)$返回值为true,表示最优解在$[m,r]$区间内,那么更新$l$的值为$m$。
6.如果$check(m)$返回值为false,表示最优解在$[l,m)$区间内,那么更新$r$的值为$m$。
7.不断重复上述步骤,直到$l+1=r$,此时的$l$值即为最终的答案。
8.输出最终的答案$l$。
线段树?!
贪心算法例题
可以借鉴下
https://blog.csdn.net/weixin_41960890/article/details/105349978