1 条题解

  • 0
    @ 2025-8-24 22:13:21

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar installb
    We are all in it together.

    搬运于2025-08-24 22:13:21,当前版本为作者最后更新于2019-11-26 20:07:01,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    其实这题还是有很多要考虑的点的 稍微说一说解题过程

    首先它要求严格次大值 所以有两个相同的数没有意义...先排序+去重
    假设原序列去重后剩下的序列为a1,a2,...,ana_1,a_2,...,a_n

    由于 a mod b<aa\ mod\ b < a 所以最大值一定是an1 mod ana_{n-1}\ mod\ a_n
    简单证明:

    • 1.对于a1a_1an2a_{n-2} 使其取模比它们大的数 就是本身 一定比an1a_{n-1}
    • 2.如果一个数模比它小的数 被模的数不可能是ana_n 那么最后值一定小于an1a_{n-1}

    然后我们可以想到 很明显an2 mod ana_{n-2}\ mod\ a_n是所有一个数模比它大的数中次大值xx
    我们还要找出一个数模比它小的数中次大值 和刚才的值xx比较
    看起来得枚举了 其实不必
    假设这个选择是aj mod aia_j\ mod\ a_i 那么如果in2i\leq n-2 这个值一定小于xx
    于是in1i\geq n-1 只剩下一种取法:j=n,i=n1j=n,i=n-1

    这两个比较 取较大的 必定就是次大值
    代码也很简短

    #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
    上传者