CF1856C To Become Max 题解 贪心

To Become Max

传送门

You are given an array of integers a a a of length n n n.

In one operation you:

  • Choose an index i i i such that 1 ≤ i ≤ n − 1 1 \le i \le n - 1 1≤i≤n−1 and a i ≤ a i + 1 a_i \le a_{i + 1} ai≤ai+1.
  • Increase a i a_i ai by 1 1 1.

Find the maximum possible value of max ⁡ ( a 1 , a 2 , ... a n ) \max(a_1, a_2, \ldots a_n) max(a1,a2,...an) that you can get after performing this operation at most k k k times.

Input

Each test contains multiple test cases. The first line of input contains a single integer t t t ( 1 ≤ t ≤ 100 1 \le t \le 100 1≤t≤100) --- the number of test cases. The description of the test cases follows.

The first line of each test case contains two integers n n n and k k k ( 2 ≤ n ≤ 1000 2 \le n \le 1000 2≤n≤1000, 1 ≤ k ≤ 1 0 8 1 \le k \le 10^{8} 1≤k≤108) --- the length of the array a a a and the maximum number of operations that can be performed.

The second line of each test case contains n n n integers a 1 , a 2 , ... , a n a_1,a_2,\ldots,a_n a1,a2,...,an ( 1 ≤ a i ≤ 1 0 8 1 \le a_i \le 10^{8} 1≤ai≤108) --- the elements of the array a a a.

It is guaranteed that the sum of n n n over all test cases does not exceed 1000 1000 1000.

Output

For each test case output a single integer --- the maximum possible maximum of the array after performing at most k k k operations.

Example

input

6
3 4
1 3 3
5 6
1 3 4 5 1
4 13
1 1 3 179
5 3
4 3 2 2 2
5 6
6 5 4 1 5
2 17
3 5

output

4
7
179
5
7
6

Note

In the first test case, one possible optimal sequence of operations is: [ 1 , 3 , 3 ] → [ 2 , 3 , 3 ] → [ 2 , 4 , 3 ] → [ 3 , 4 , 3 ] → [ 4 , 4 , 3 ] [\textcolor{red}{1}, 3, 3] \rightarrow [2, \textcolor{red}{3}, 3] \rightarrow [\textcolor{red}{2}, 4, 3] \rightarrow [\textcolor{red}{3}, 4, 3] \rightarrow [4, 4, 3] [1,3,3]→[2,3,3]→[2,4,3]→[3,4,3]→[4,4,3].

In the second test case, one possible optimal sequence of operations is: [ 1 , 3 , 4 , 5 , 1 ] → [ 1 , 4 , 4 , 5 , 1 ] → [ 1 , 5 , 4 , 5 , 1 ] → [ 1 , 5 , 5 , 5 , 1 ] → [ 1 , 5 , 6 , 5 , 1 ] → [ 1 , 6 , 6 , 5 , 1 ] → [ 1 , 7 , 6 , 5 , 1 ] [1, \textcolor{red}{3}, 4, 5, 1] \rightarrow [1, \textcolor{red}{4}, 4, 5, 1] \rightarrow [1, 5, \textcolor{red}{4}, 5, 1] \rightarrow [1, 5, \textcolor{red}{5}, 5, 1] \rightarrow [1, \textcolor{red}{5}, 6, 5, 1] \rightarrow [1, \textcolor{red}{6}, 6, 5, 1] \rightarrow [1, 7, 6, 5, 1] [1,3,4,5,1]→[1,4,4,5,1]→[1,5,4,5,1]→[1,5,5,5,1]→[1,5,6,5,1]→[1,6,6,5,1]→[1,7,6,5,1].

以上来自 C o d e F o r c e s 以上来自CodeForces 以上来自CodeForces

题目翻译

给你一个长度为 n n n 的整数数组 a a a 。

在一次操作中,你

  • 选择一个索引 i i i ,使 1 ≤ i ≤ n − 1 1 \le i \le n - 1 1≤i≤n−1 和 a i ≤ a i + 1 a_i \le a_{i + 1} ai≤ai+1 .
  • 将 a i a_i ai 增加 1 1 1 。

求最多执行 k k k 次这一操作后, max ⁡ ( a 1 , a 2 , ... a n ) \max(a_1, a_2, \ldots a_n) max(a1,a2,...an) 的最大可能值。

输入格式

每个测试包含多个测试用例。第一行输入包含一个整数 t t t ( 1 ≤ t ≤ 100 1 \le t \le 100 1≤t≤100 ) - 测试用例的个数。测试用例说明如下。

每个测试用例的第一行包含两个整数 n n n 和 k k k ( 2 ≤ n ≤ 1000 2 \le n \le 1000 2≤n≤1000 , 1 ≤ k ≤ 1 0 8 1 \le k \le 10^{8} 1≤k≤108 )--数组的长度 a a a 和可执行的最大操作数。

每个测试用例的第二行包含 n n n 个整数 a 1 , a 2 , ... , a n a_1,a_2,\ldots,a_n a1,a2,...,an ( 1 ≤ a i ≤ 1 0 8 1 \le a_i \le 10^{8} 1≤ai≤108 ) - 数组 a a a 的元素。

保证所有测试用例的 n n n 之和不超过 1000 1000 1000 。

输出格式

对每个测试用例输出一个整数,即数组最多执行 k k k 次操作后的最大值。

提示

在第一个测试案例中,一个可能的最佳操作顺序是 [ 1 , 3 , 3 ] → [ 2 , 3 , 3 ] → [ 2 , 4 , 3 ] → [ 3 , 4 , 3 ] → [ 4 , 4 , 3 ] [\textcolor{red}{1}, 3, 3] \rightarrow [2, \textcolor{red}{3}, 3] \rightarrow [\textcolor{red}{2}, 4, 3] \rightarrow [\textcolor{red}{3}, 4, 3] \rightarrow [4, 4, 3] [1,3,3]→[2,3,3]→[2,4,3]→[3,4,3]→[4,4,3] .

在第二个测试案例中,一个可能的最佳操作序列是: [ 1 , 3 , 4 , 5 , 1 ] → [ 1 , 4 , 4 , 5 , 1 ] → [ 1 , 5 , 4 , 5 , 1 ] → [ 1 , 5 , 5 , 5 , 1 ] → [ 1 , 5 , 6 , 5 , 1 ] → [ 1 , 6 , 6 , 5 , 1 ] → [ 1 , 7 , 6 , 5 , 1 ] [1, \textcolor{red}{3}, 4, 5, 1] \rightarrow [1, \textcolor{red}{4}, 4, 5, 1] \rightarrow [1, 5, \textcolor{red}{4}, 5, 1] \rightarrow [1, 5, \textcolor{red}{5}, 5, 1] \rightarrow [1, \textcolor{red}{5}, 6, 5, 1] \rightarrow [1, \textcolor{red}{6}, 6, 5, 1] \rightarrow [1, 7, 6, 5, 1] [1,3,4,5,1]→[1,4,4,5,1]→[1,5,4,5,1]→[1,5,5,5,1]→[1,5,6,5,1]→[1,6,6,5,1]→[1,7,6,5,1].

翻译: D e e p L 翻译:DeepL 翻译:DeepL

解题思路

先看数据范围: 2 ≤ n ≤ 1000 2 \le n \le 1000 2≤n≤1000,那么直接使用贪心。

暴力思想

枚举最终成为答案的数 a i a_i ai。一开始肯定要利用 a i + 1 a_{i+1} ai+1 让 a i a_i ai 变得尽可能大,这样的代价是最小的。当 a i > a i + 1 a_i>a_{i+1} ai>ai+1 时怎么办?利用 a i + 2 a_{i+2} ai+2 让 a i + 1 a_{i+1} ai+1 变大。

优化(贪心)

如果操作次数足够多,那么最终的序列肯定是形如 x , x − 1 , ⋯ , a n + 1 , a n x,x−1,⋯,a_n+1,a_n x,x−1,⋯,an+1,an 的。也就是说,依次枚举 j ∈ [ i + 1 , n ] j \in [i+1,n] j∈[i+1,n],当 a j ≥ a j − 1 a_j\ge a_{j−1} aj≥aj−1 时,至多就可以让 a i a_i ai 变大 a j − a j − 1 + 1 a_j-a_{j−1}+1 aj−aj−1+1,此时更新答案即可。如果不满足, a j a_j aj 在后续的更新过程中肯定要变成 a j − 1 − 1 a_{j−1}−1 aj−1−1,否则无法使 a i a_i ai 变得更大,提前更新 a j a_j aj 即可。

时间复杂度 O ( n 2 ) O(n^2) O(n2),写二分的是不是惊呆了。

AC Code

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int Maxn = 1000 + 5;
int n, k, a[Maxn];
int b[Maxn];
int ans;
inline int Binary_search(int n, int k);
inline void solve();
inline void work() {
	int T;
	cin >> T;
	while (T--) {
		solve();
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	work();
	return 0;
}
inline void solve() {
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	ans = Binary_search(n, k);
	cout << ans << endl;
}
inline int Binary_search(int n, int k) {
	int tmp, t;
	int ans = a[n];
	for (int i = n - 1; i >= 1; i--) {
		for (int j = 1; j <= n; j++) {
			b[j] = a[j];
		}
		t = k;
		for (int j = i + 1; j <= n && t > 0; j++) {
			if (b[j] < b[j - 1]) {
				t -= b[j - 1] - 1 - b[j];
				b[j] = b[j - 1] - 1;
			} else {
				tmp = min(1ll * (b[j] - b[j - 1] + 1) * (j - i), t);
				t -= tmp;
				b[i] += tmp / (j - i);
			}
			ans = max(ans, b[i]);
		}
	}
	return ans;
}

吐槽一下洛谷对于该题的提示的染色问题。详见此处

相关推荐
盼海4 分钟前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步20 分钟前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
Rstln1 小时前
【DP】个人练习-Leetcode-2019. The Score of Students Solving Math Expression
算法·leetcode·职场和发展
芜湖_1 小时前
【山大909算法题】2014-T1
算法·c·单链表
珹洺1 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
孙同学要努力1 小时前
C++知识整理day1——前置基础知识整理(命名空间、输入输出、函数重载、引用)
开发语言·c++
沐泽Mu1 小时前
嵌入式学习-C嘎嘎-Day05
开发语言·c++·学习
几窗花鸢2 小时前
力扣面试经典 150(下)
数据结构·c++·算法·leetcode
.Cnn2 小时前
用邻接矩阵实现图的深度优先遍历
c语言·数据结构·算法·深度优先·图论
2401_858286112 小时前
101.【C语言】数据结构之二叉树的堆实现(顺序结构) 下
c语言·开发语言·数据结构·算法·