1 条题解
-
0
自动搬运
来自洛谷,原作者为

installb
We are all in it together.搬运于
2025-08-24 22:13:21,当前版本为作者最后更新于2019-11-26 20:07:01,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
其实这题还是有很多要考虑的点的 稍微说一说解题过程
首先它要求严格次大值 所以有两个相同的数没有意义...先排序+去重
假设原序列去重后剩下的序列为由于 所以最大值一定是
简单证明:- 1.对于到 使其取模比它们大的数 就是本身 一定比小
- 2.如果一个数模比它小的数 被模的数不可能是 那么最后值一定小于
然后我们可以想到 很明显是所有一个数模比它大的数中次大值
我们还要找出一个数模比它小的数中次大值 和刚才的值比较
看起来得枚举了 其实不必
假设这个选择是 那么如果 这个值一定小于
于是 只剩下一种取法:这两个比较 取较大的 必定就是次大值
代码也很简短#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; }
- 1
信息
- ID
- 4700
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者