P5682 [CSP-J2019 江西] 次大值% 运算 set 去重的一道好题

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n, x, len, a[100010], ans;
set<int> s;
set<int>::iterator asd;
int main()
{
    /*
    a[n-1]  是最大的
    a[n-2]  可能是次大的
    a[n]%a[n-1]<a[n-1] 不可能是最大的,可能是次大的
    a[n-1]%a[n-2]<a[n-2]  不可能是次大的
    a[n-2]%a[n-3]<a[n-3]  不可能是次大的
    所以次大值在a[n-2]和a[n]%a[n-1]中取得,为两者中的最大值
    */
    scanf("%d", &n);
    //set会自动从小到大排序
    for(int i=1; i<=n; ++i){
        scanf("%d", &x);
        s.insert(x);
    }
    n=int(s.size());    //获取不重复的数字个数
    asd=s.begin();
    //将数字存在a数组中
    for(int i=1; i<=n; ++i){
        a[i]=*asd;  //asd 是迭代器
        asd++;
    }
    //原数只有 1 个
    if(n==1){
        printf("-1");
    }
    else if(n==2){  //原数有两个, 则余数为 a[n-1] 和 a[n]%a[n-1]<a[n-1]
        printf("%d", a[n]%a[n-1]);
    }
    else{   //原数至少 3 个
        ans=max(a[n]%a[n-1], a[n-2]);
        printf("%d", ans);
    }
    return 0;
}
相关推荐
点云SLAM几秒前
C++包装器之类型擦除(Type Erasure)包装器详解(4)
c++·算法·c++17·类型擦除·c++高级应用·c++包装器·函数包装
yugi9878385 分钟前
TDOA算法MATLAB实现:到达时间差定位
前端·算法·matlab
t1987512817 分钟前
基于因子图与和积算法的MATLAB实现
开发语言·算法·matlab
le serein —f19 分钟前
用go实现-回文链表
算法·leetcode·golang
rit843249922 分钟前
MFOCUSS算法MATLAB实现:稀疏信号重构
算法·matlab·重构
发疯幼稚鬼24 分钟前
散列及其分离链接法
c语言·数据结构·算法·链表·散列表
Bdygsl25 分钟前
数字图像处理总结 Day 1
人工智能·算法·计算机视觉
北郭guo26 分钟前
垃圾回收底层原理【深入了解】
java·jvm·算法
小年糕是糕手26 分钟前
【C++同步练习】C++入门
开发语言·数据结构·c++·算法·pdf·github·排序算法
报错小能手27 分钟前
数据结构 链式队列
数据结构·算法