本文共 1386 字,大约阅读时间需要 4 分钟。
为了解决问题,我们需要找到一个数,使得在去除它之后,前缀的最后一个数尽可能大,且这样的最大值出现的次数最多。以下是解决方案的详细分析和优化步骤:
我们需要从数组中去除一个数,使得在删除后的数组中,每个前缀的最后一个数的最大值出现的次数尽可能多。这个问题可以通过动态处理每个元素,以及维护当前最大值和次大值来解决。
我们可以用一个辅助数组记录每个元素被选中作为前缀最大值的次数。通过扫描数组,维护当前最大值和次大值:
max_val
和second_max
分别记录当前数组的最大值和次大值。max_val
,则更新max_val
并记录次大值为原max_val
,然后在辅助数组中标记当前元素的最大值出现次数。second_max
,则在辅助数组中标记原max_val
的次数增加次,更新次大值为当前元素。#includeusing namespace std;const int mod = 1e9 + 7;int n;int max_val = -1e9;int second_max = -1e9;int a[100010]; // 用于记录每个元素被选中作为max_val的次数int main() { cin >> n; for (int i = 1; i <= n; i++) { int x; cin >> x; if (x > max_val) { second_max = max_val; max_val = x; a[x] = -1; // 将该元素设为-1,表示去掉它后前缀可能会受到影响 } else if (x > second_max) { a[max_val] += 1; // 将原来的max_val的影响次数+1 second_max = x; } } int max_count = -1e9; int result = -1; for (int i = 1; i <= n; i++) { if (a[i] > max_count) { max_count = a[i]; result = i; } } cout << result << endl; return 0;}
max_val
和second_max
初始化为-1e9,用来记录当前数组的最大值和次大值。max_val
和second_max
比较,更新最大值和次大值,并根据需要更新辅助数组。a
用于记录每个元素被选中作为前缀最大值的次数。该方法通过一次扫描数组,保证时间复杂度为O(n),能够高效解决问题。
转载地址:http://akstz.baihongyu.com/