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 1in1 and a i ≤ a i + 1 a_i \le a_{i + 1} aiai+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 1t100) — 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 2n1000, 1 ≤ k ≤ 1 0 8 1 \le k \le 10^{8} 1k108) — 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} 1ai108) — 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 1in1 a i ≤ a i + 1 a_i \le a_{i + 1} aiai+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 1t100 ) - 测试用例的个数。测试用例说明如下。

每个测试用例的第一行包含两个整数 n n n k k k 2 ≤ n ≤ 1000 2 \le n \le 1000 2n1000 1 ≤ k ≤ 1 0 8 1 \le k \le 10^{8} 1k108 )–数组的长度 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} 1ai108 ) - 数组 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 2n1000,那么直接使用贪心。

暴力思想

枚举最终成为答案的数 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,x1,,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} ajaj1 时,至多就可以让 a i a_i ai 变大 a j − a j − 1 + 1 a_j-a_{j−1}+1 ajaj1+1,此时更新答案即可。如果不满足, a j a_j aj 在后续的更新过程中肯定要变成 a j − 1 − 1 a_{j−1}−1 aj11,否则无法使 a i a_i ai 变得更大,提前更新 a j a_j aj 即可。

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

AC Code

#include 
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;
}

吐槽一下洛谷对于该题的提示的染色问题。(已修改)

你可能感兴趣的:(题解,c++,算法,c语言)