小凯在玩一个数字合并游戏。最开始给定N个正整数,每次可以选相邻的两个相同的数,然后合并成一个比原来的大1的数(例如两个7合并成一个8),目标是使得最大的数最大,请帮助小凯来求最大值。Input输入的第一行包含一个整数N(2≤N≤262144),接下来的N行每行一个序列中的数字,范围在1-40。Output输出一个最大值。
请为以下代码设计几个测试用例:#include <bits/stdc++.h> #define endl "\n" #pragma GCC optimize(3,"Ofast","inline") using namespace std; const int maxn = 262150; const int max_sum = 60; int a[maxn]; int dp[maxn][max_sum];
int main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; }
int maxv = 0;
for (int j = 1; j <= max_sum; j++) {
for (int i = 1; i <= n; i++) {
if (a[i] == j)
dp[i][j] = i + 1;
else {
dp[i][j] = dp[dp[i][j - 1]][j - 1];
}
if (dp[i][j])
maxv = max(maxv, j);
}
}
cout << maxv << endl;
return 0;
}
为了测试这个代码,我们需要设计一些测试用例来验证其正确性和性能。以下是几个测试用例:
输入:
2
1
1
预期输出:
2
解释: 两个1可以合并成一个2。
输入:
3
1
2
3
预期输出:
3
解释: 没有相邻的相同数字,最大值就是3。
输入:
4
2
2
2
2
预期输出:
4
解释: 两个2合并成一个3,再两个3合并成一个4。
输入:
6
1
1
2
2
3
3
预期输出:
4
解释: 1和1合并成2,2和2合并成3,3和3合并成4。
输入:
10
1
1
1
1
1
1
1
1
1
1
预期输出:
5
解释: 连续合并,最终可以得到一个5。
输入:
262144
1
1
1
...
1
预期输出:
19
解释: 连续合并,最终可以得到一个19(因为2^19 = 524288 > 262144)。
输入:
5
3
3
2
2
1
预期输出:
4
解释: 3和3合并成4,2和2合并成3,最大值是4。
输入:
5
1
2
3
4
5
预期输出:
5
解释: 没有相邻的相同数字,最大值就是5。
这些测试用例涵盖了最小输入、没有可合并的数字、所有数字相同、复杂的合并情况、大规模输入、边界测试和随机输入等情况,可以有效地验证代码的正确性和性能。