【题解】【数学】—— [CSP-J2019 江西] 次大值

news2024/11/15 23:35:25

【题解】【数学】—— [CSP-J2019 江西] 次大值

  • [CSP-J2019 江西] 次大值
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入 #1
      • 输出 #1
      • 输入 #2
      • 输出 #2
      • 输入 #3
      • 输出 #3
    • 提示
  • 解法1.暴力枚举(非正解)
    • 1.1.题意分析
    • 1.2.代码
  • 解法2.总结规律(正解)
    • 2.1.题意分析
      • 2.1.1.解题思路
      • 2.2.2.功能拆解
    • 2.2.代码

前置知识:取模运算的特性。
[CSP-J2019 江西] 次大值

[CSP-J2019 江西] 次大值

题目描述

Alice 有 n n n 个正整数,数字从 1 ∼ n 1 \sim n 1n 编号,分别为 a 1 , a 2 , … , a n a_1,a_2, \dots , a_n a1,a2,,an
Bob 刚学习取模运算,于是便拿这 n n n 个数进行练习,他写下了所有

a i   m o d   a j ( 1 ≤ i , j ≤ n ∧ i ≠ j ) a_i \bmod a_j (1 \le i,j \le n \wedge i \neq j) aimodaj(1i,jni=j)

的值,其中   m o d   \bmod mod 表示取模运算。

Alice 想知道所有的结果中,严格次大值是多少。将取模后得到的所有值进行去重,即相同的结果数值只保留一个,剩余数中第二大的值就称为严格次大值。

输入格式

第一行一个正整数 n n n,表示数字个数。
第二行 n n n 个正整数表示 a i a_i ai

输出格式

仅一行一个整数表示答案。
若取模结果去重后剩余数字不足两个,则输出 − 1 -1 1

输入输出样例

输入 #1

4
4 5 5 6

输出 #1

4

输入 #2

4
1 1 1 1

输出 #2

-1

输入 #3

7
12 3 8 5 7 20 15

输出 #3

12

提示

【数据范围】
对于 40 % 40\% 40% 的数据, 1 ≤ n , a i ≤ 100 1\le n,a_i \le 100 1n,ai100
对于 70 % 70\% 70% 的数据, 1 ≤ n ≤ 3000 1\le n \le 3000 1n3000 1 ≤ a i ≤ 1 0 5 1\le a_i \le 10^5 1ai105
对于 100 % 100\% 100% 的数据, 3 ≤ n ≤ 2 × 1 0 5 3 \le n \le 2\times 10^5 3n2×105 1 ≤ a i ≤ 1 0 9 1\le a_i \le 10^9 1ai109

【样例 1 1 1 解释】
所有取模的结果为 { 4 , 4 , 4 , 1 , 0 , 5 , 1 , 0 , 5 , 2 , 1 , 1 } \{4,4,4,1,0,5,1,0,5,2,1,1\} {4,4,4,1,0,5,1,0,5,2,1,1}
去重后有: { 0 , 1 , 2 , 4 , 5 } \{0,1,2,4,5 \} {0,1,2,4,5},结果为 4 4 4

解法1.暴力枚举(非正解)

1.1.题意分析

    看到这道题,大多数人想到的就是暴力枚举。循环每个i和j,记录余数,最后再排序去重。记得特判后再输出。
在这里插入图片描述
能骗到这么多分,就这样交上去吧

1.2.代码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 30000010
int main()
{
    int n,a[MAXN],cnt=0,b[MAXN];//用数组b存储每个余数,cnt储存数组b的大小
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)//循环i
        for(int j=1;j<=n;j++)//循环j
            if(i!=j)//如果i不等于j,计算余数
                b[++cnt]=a[i]%a[j];
    sort(b+1,b+cnt+1,greater<int>());//从大到小排序
    cnt=unique(b+1,b+cnt+1)-(b+1);//去重,底下会详细讲解
    if(cnt<2)//无解特判
        printf("-1");
    else
        printf("%d",b[2]);
    return 0;
}

解法2.总结规律(正解)

2.1.题意分析

2.1.1.解题思路

    不行!不能躺平!这道题一定要拿到满分!

    我们知道,取模有两个性质

性质1.对于 a % b = c ( a < b ) , c = a a\%b=c(a<b),c=a a%b=c(a<b),c=a
性质2.对于 a % b = c ( a > b ) , c < a a\%b=c(a>b),c<a a%b=c(a>b),c<a

利用这两种性质,我们知道,这道题可以分两种情况讨论

1. a [ i ] < a [ j ] a[i]<a[j] a[i]<a[j],即被除数小于除数
2. a [ i ] > a [ j ] a[i]>a[j] a[i]>a[j].即被除数大于除数

先看第一种情况:
    对于满足性质1的一组数,只要被除数越大,那么余数就越大。将数组 从大到小排序,那么 a [ 2 ] ( 第二大的数 ) % a [ 1 ] ( 最大的数 ) a[2](第二大的数)\%a[1](最大的数) a[2](第二大的数)%a[1](最大的数) 就是这组余数的最大值。(注意要求的是严格最大值,所以要先对数组去重)

    同理,这组数的次大值就是 a [ 3 ] % a [ 1 ] a[3]\%a[1] a[3]%a[1]

注意,因为经过了去重和排序,所以保证a[1]>a[2]>a[3]。又因为性质1,保证 a [ 2 ] % a [ 1 ] > a [ 3 ] % a [ 1 ] a[2]\%a[1]>a[3]\%a[1] a[2]%a[1]>a[3]%a[1]。所以以上推理均为正确的。

再看第二种情况:
    对于满足性质2的一组数,因为除数决定了余数的最大值,所以除数越大越好,这种情况下的次大值就是 a [ 1 ] % a [ 2 ] a[1]\%a[2] a[1]%a[2]

因为 a [ 1 ] % a [ 2 ] 的最大值是 a [ 2 ] − 1 a[1]\%a[2]的最大值是a[2]-1 a[1]%a[2]的最大值是a[2]1,而 a [ 2 ] % a [ 1 ] 的值是 a [ 2 ] a[2]\%a[1]的值是a[2] a[2]%a[1]的值是a[2],所以这种情况下的最大值还是 a [ 2 ] % a [ 1 ] a[2]\%a[1] a[2]%a[1]

接下来就是这两种情况争,谁最大谁就当次大值

如果看不懂,可以自己尝试制造几组样例代入理解。有的时候这样就是要自己亲身体会才能理解其中的奥妙。

2.2.2.功能拆解

对于排序,使用STL里的sort
sort(a+1,a+n+1,greater<int>());//从大到小排序,如果不理解可以自己上网搜一下

对于去重,使用STL里的unique。它会自动返回处理好的数组的尾指针。使用时拿它减去头指针就是处理好的数组元素个数。不理解就直接照抄就行了。
n=unique(a+1,a+n+1)-(a+1);//n代表处理好的数组元素个数

2.2.代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a[200010];
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1,greater<int>());//从大到小排序 
    n=unique(a+1,a+n+1)-(a+1);//去重 
    if(n<2)
	    printf("-1");//去重后的数字小于2个,无解 
	else 
	    printf("%d",max(a[3],a[1]%a[2]));//输出两种情况的最大值 
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5个适用于Linux系统的PDF转Word工具

凭借其跨平台和设备的统一标准、兼容性和规模小巧等主要优点&#xff0c;可携带文档格式&#xff08;PDF&#xff09;可谓最主流的文件格式之一。 市面上有许多查看PDF文件的强大工具&#xff0c;因此所有Linux系统的用户都可以根据自身喜好找到合适的PDF查看工具。然而&#x…

三星、小米和 OPPO设备实验室将采用Android设备流技术

早在 5 月份的年度开发者大会上&#xff0c;Google就发布了 Android 设备流测试版。开发人员可以在Google数据中心的真实物理设备上更轻松、更互动地测试自己的应用程序&#xff0c;这些设备会直接串流到 Android Studio。今天&#xff0c;Google宣布与三星、小米和 OPPO 合作扩…

染色法+组合数学,CF 557D - Vitaly and Cycle

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 557D - Vitaly and Cycle 二、解题报告 1、思路分析 t 的取值范围为&#xff1a;[0, 3] 0&#xff1a;本身有奇环&#xff0c;样例说明方案为1 1&#xff1a;存在偶数长度路径&#xff0c;连接一下就行&a…

【数据结构】顺序表实现

0. 前言 小伙伴们大家好&#xff0c;从今天开始&#xff0c;我们就开始学习《数据结构》这门课程~ 首先想给大家讲讲什么是数据结构&#xff1f; 0.1 数据结构是什么&#xff1f; 数据结构是由“数据”和“结构”两词组合⽽来。 什么是数据&#xff1f; 比如常⻅的数值1、…

Visionpro二次开发学习笔记8-如何将静态或交互式图形添加到CogDisplay中

如何将静态或交互式图形添加到CogDisplay中 CogDisplay支持两种类型的图形&#xff1a;静态图形和交互式图形。静态图形一旦添加到显示中&#xff0c;就无法移动或更改。静态图形不能添加提示文本&#xff08;TipText&#xff09;。 交互式图形在启用图形的交互属性时&#x…

【数据结构】-----二叉搜索树(C++)

目录 前言 一、是什么 ​编辑 二、实现 Ⅰ、结点类 Ⅱ、结构及基本接口实现 ​编辑 ①插入 ②查找 ③删除(重难点) 情况一&#xff1a;待删除结点为叶子结点(无孩子) 情况二&#xff1a;待删除结点存在一个孩子结点(可能左/右) 情况三&#xff1a;待删除结点存在…

【iOS】—— 事件传递链和响应者链总结

事件传递链和响应者链总结 1. 事件传递链&#xff1a;事件传递链&#xff1a;传递流程&#xff1a;总结第一响应者&#xff1a; 2. 响应者链响应者链传递流程总结响应者链流程 总结&#xff1a; 之前也学习过这个内容这次在复习的时候&#xff0c;就想着写一下总结&#xff1a;…

Linux部署python3.0版本——及基本操作

&#xff08;一&#xff09;部署环境 首先查看列表&#xff0c;找到python3.0的包 yum list installed|grep python 如果没有&#xff0c;是因为yum源的问题&#xff0c;可部署阿里云镜像然后下载epel包&#xff0c;这里的内容可参考前面的阿里云镜像部署 然后进行下载 yum…

TensorRT-LLM中的 Quantization GEMM(Ampere Mixed GEMM)的 CUTLASS 2.x 实现讲解

在LLM的推理和部署中&#xff0c;低精度量化对于性能的提升十分关键&#xff0c;本次分享将为大家介绍TRT-LLM中是如何基于CUTLASS 2.x来实现PerChannel/AWQ/SmoothQuant等量化方法在模型推理过程的计算。Slides来自BiliBili NVIDIA英伟达频道 上传的《TensorRT-LLM中的 Quanti…

最新CSS3伪类和伪元素详解

第4章 伪类和伪元素 4.1结构伪类 E:first-child{},第一个元素 样式&#xff1a; p:first-child {color: red; } <div><p>Lorem ipsum</p><p>Dolor sit amet.</p> </div> 4.1.1nth-*伪类 以计数为基础的&#xff0c;默认情况下&…

某赛通电子文档安全管理系统 CDGAuthoriseTempletService1 SQL注入漏洞复现(XVE-2024-19611)

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

RPA在政务服务中的挑战与解决方案

随着数字化时代的到来&#xff0c;数字政务的建设已成必然趋势&#xff0c;RPA作为数字化转型的重要工具之一&#xff0c;能够帮助政府单位快速实现业务流程的自动化和智能化&#xff0c;提高工作效率和质量&#xff0c;为建设数字政务提供强有力的支持&#xff0c;因此正被越来…

深植根基、蓬勃向上 | openKylin 2.0正式发布!

2024年8月8日&#xff0c;openKylin 2.0版本正式发布&#xff01;该版本默认搭载Linux 6.6 LTS内核&#xff0c;完成180操作系统核心组件自主选型升级&#xff0c;深度融合AI技术&#xff0c;上线麒麟AI助手等实用AI功能&#xff0c;并为用户带来包括开明软件包格式、不可变系统…

Unity 在Editor下保存对Text组件的文本的修改

Unity 在Editor下保存对Text组件的文本的修改 /****************************************************文件&#xff1a;TimeStampForText.cs作者&#xff1a;lenovo邮箱: 日期&#xff1a;2024/8/8 1:9:21功能&#xff1a; *************************************************…

聚观早报 | 小米15 Ultra相机规格;一加Ace 5参数规格

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 8月8日消息 小米15 Ultra相机规格 一加Ace 5参数规格 iOS 18.1代码曝光 SK电讯加大AI投入 Figure 02 人形机器人…

【VScode】如何在anaconda虚拟环境中打开vscode项目

文章目录 【必备知识】打开anaconda虚拟环境切换到项目工作目录激活anaconda虚拟路径让vscode从当前目录打开 【必备知识】 anaconda环境变量配置及配置python虚拟环境 https://blog.csdn.net/xzzteach/article/details/140621596 打开anaconda虚拟环境 切换到项目工作目录 …

Ftrans文件摆渡方案:重塑文件传输与管控的科技先锋

一、哪些行业会用到文件摆渡相关方案 文件摆渡相关的产品和方案通常用于需要在不同的网络、安全域、网段之间传输数据的场景&#xff0c;主要是一些有核心数据需要保护的行业&#xff0c;做了网络隔离和划分。以下是一些应用比较普遍的行业&#xff1a; 金融行业&#xff1a;…

第 11 课:多方安全计算在安全核对的行业实践

业务背景&#xff1a;安全核对产生的土壤 产品方案&#xff1a;从试点到规模化的路 技术共建&#xff1a;与隐语的共同成长

three.js 空间坐标绘制多边形围栏(结合react)

空间坐标点绘制多边形&#xff0c;实际上可以理解为是由 “点” 到 “线” 到 “面” 的一个过程。将空间坐标点通过THREE.Shape绘制多条线并闭合而得到一个封闭的二维形状平面对象&#xff0c;使用THREE.ShapeGeometry将Shape对象转换为Geometry对象添加Mesh&#xff0c;最终得…

全国多地公布2024下半年软考报名具体时间

下半年开考科目&#xff1a; 高级资格&#xff1a;系统分析师、系统架构设计师、网络规划设计师、系统规划与管理师 中级资格&#xff1a;软件设计师、网络工程师、信息安全工程师、信息系统监理师、多媒体应用设计师、系统集成项目管理工程师 初级资格&#xff1a;网络管理…