题解 P5682 【[CSPJX2019]次大值】
这题还是有很多要考虑的点的,稍微说一说解题过程。
首先本题要求的是严格次大值,所以有两个相同的数没有意义(简单分析一下可以发现,不需要考虑
最大值一定是
然后我们可以发现,
看起来需要枚举,其实不必。假设这个选择是
于是
这两个比较,取较大的,必定就是次大值。
代码也很简短:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
int n;
int a[300005];
int main(){
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
sort(a + 1,a + 1 + n); n = unique(a + 1,a + 1 + n) - a - 1;
// 排序+去重
a[0] = 0;
if(n <= 1) printf("-1\n");
// 无解特判
else printf("%d\n",max(a[n - 2],a[n] % a[n - 1]));
return 0;
}