小议CSDN周赛57期 - 凑数

news2024/11/17 7:29:31

本期周赛几乎忘记参加,在最后几分钟的时候上来看了看。那些选择判断一通乱选,填空题也已经被吐槽得差不多了,这里不多说,只说我对第一道编程题的看法(吐槽)。因为 C 站的机制是,即使它错了,它也不会承认(印象里只承认且改过一次),再争辩只会把你拉黑,甚至限流也有可能,所以只能把我的观点放在博客里,不再专门去反馈了。

先来看题目:

给定一组n个正整数,要求每次选其中一个数乘以或除以一个素数(称为一次凑数),问至少需要凑数多少次可以把所有的数都凑成相等。

输入描述:

第一行输入n个正整数(0<n<=1000000,其中每个数都小于1000000)。

输出描述:

可以把所有的数都凑成相等需要至少进行的凑数次数t(t>=0)。

输入样例:

5 20

输出样例:

2

我的观点是:这是道好题——好题在我这里的定义是,大部分人的解读是错的。而且至少目前来看,还没发现有人说对了。甚至我有九成的把握,此题测试用例的“标准答案”也是错的,剩下一成留给出题人来“深度解读”题意。

我认为此题关于“凑数”的定义是没有歧义的:

  1. 每次选其中一个数
  2. 将其乘以除以一个素数(质数)

同时满足上面两点即称为“一次凑数”,注意黑体加粗的“”字。而将所有数字通过凑数变成相等的目标数字,却是没有确定的。

所以根据上述规则,对于给出的样例的两个数字 5 和 20 来说,有三种最优的方式(两次凑数)将其变成相等。

  • 5*2*2=20
  • 20\div 2\div2=5
  • 5*2=10 , 20\div2=10

只有两个数字时,找出这样的目标数字并不难——肉眼可见,前两种方法分别是最小公倍数最大公约数。但能不能把这种规律扩展到三个数字以上呢?相信很多人的第一反应也是这样做的(通过测试用例的答案来看,感觉出题人可能也是这样想的)。但是很遗憾,由于“凑数”的定义是“其中一个数“”可以“乘以或除以”,并没有规定所有数都只能乘以或除以,所以存在第三种情况,即当某一部分的数字乘以一个素数,另一部分的数字除以一个素数的时候,也就是说,将所有数字变成一个最小公倍数和最大公约数之间的中间数字的时候,总的操作数更少。

举个简单的例子:2, 4, 8 。这三个数字的最小公倍数是 8, 最大公约数是 2,但是如果将三个数字都变成 8 或 2,都需要 3 次凑数:

  • 2*2*2=8,4*2=8
  • 8\div2\div2=2,4\div2=2

但是如果把三个数字都变成 4,只需要 2 次凑数:

2*2=4,8\div2=4

所以,我们不能通过找最小公倍数或最大公约数,找到最优的凑数方案。

那该怎么做呢?

我们知道,任何正整数都可以进行质因数分解,写成 p_{1}^{x}*p_{2}^{y}*...*p_{n}^{z} 的形式。其中 p_{n} 表示所有素数,(x,y,z)\geq 0 。

而将所有整数都变成一个相等的目标数字,等价于将所有整数的质因数排列形式变成一致。其中,整数里原本没有的质数,就要加上(乘以),原本多出来的质数,就要减少(除以),最终使得所有数字包含的每个质数的个数都各自相同。而相信你也看出来了,这里的“加上”和“减少”操作,其实就是本题所定义的“凑数”。

用公式来说明,假如有三个整数 A,B,C,分别可以写成

  • A = p_{1}^{x_{1}}*p_{2}^{y_{1}}*p_{3}^{z_{1}}
  • B = p_{1}^{x_{2}}*p_{2}^{y_{2}}*p_{3}^{z_{2}}
  • C = p_{1}^{x_{3}}*p_{2}^{y_{3}}*p_{3}^{z_{3}}

而我们想要凑成的最终数字,应该是

Target = p_{1}^{x_{n}}*p_{2}^{y_{n}}*p_{3}^{z_{n}}

其中,x_{1},x_{2},x_{3} 各自通过加减,统统变成 x_{n}y_{1},y_{2},y_{3} 各自通过加减,统统变成 y_{n}z_{1},z_{2},z_{3} 各自通过加减,统统变成 z_{n} 。不难看出,本题所要找的“凑数次数”,就是上面这些质数原本的个数变成最终个数,所需要的加或减的次数之和。而要使这个“次数之和”最小,每个质数原本的个数到最终个数的距离之和就必须最小。

所以,问题的关键变成了如何找出每个质数的“最终个数”。

相信有点数学基础的同学,很容易就能发现:在一群数中间找到一个数,使得所有数字到这个数字的距离之和最小,那么这个数必然是这群数字的中位数。——实际上,这也是中位数用处最广的特性之一。

到此,解题方法呼之欲出了。只需下面三步:

  1. 将所有整数进行质因数分解,找出所有质数的个数
  2. 将这些质数的个数分别进行排序,找到每个质数个数的中位数(没有该质数的整数相应的个数记为 0,参与排序)
  3. 累加每个质数到其中位数的个数之差。

相关代码放在某个地方了,这里就不重复了 :D

但是很遗憾,虽然我自信这种做法是正确的,但却通不过 C 站的测试。——这也是为什么我说九成认定 C 站的答案错了。

以彼之矛攻彼之盾,我们用 C 站本题自己的用例来打脸它。

本题有一组相对数量较少的用例如下:

arr = [934906, 869814, 593826, 642589, 904024, 572674, 718422, 812732, 873256, 582947]

标准答案是 38。也就是说 C 站认为最少需要 38 次凑数才能将所有数字变成相等。

虽然我不知道 C 站认为的最终相等的数字是多少,但我知道将所有数字都变成 1,是需要 38 次的,所以可以拿来进行分析和比较。具体如下:

  • 934906\div 2\div7\div43\div1553=1
  • 869814 \div2\div3\div3\div11\div23\div191=1
  • 593826 \div2\div3\div19\div5209=1
  • 642589\div313\div2053=1
  • 904024 \div2\div2\div2\div11\div10273=1
  • 572674 \div 2\div43\div6659=1
  • 718422 \div 2\div3\div119737=1
  • 812732 \div 2\div2\div203183=1
  • 873256 \div2\div2\div2\div17\div6421=1
  • 582947 \div 17\div53\div647=1

虽然本例有点变态(出现了6位质数),但万变不离其宗,用我们前面介绍的方法进行分析,甚至通过肉眼就可以发现,这里有八个偶数,只有两个奇数,很显然将两个奇数乘以 2,要比将八个偶数除以 2,次数更少。

所以,我认为的正确答案应该是 32 次,也就是将所有数字变成 2,仅需要 32 次凑数:

  • 934906\div7\div43\div1553=2
  • 869814 \div3\div3\div11\div23\div191=2
  • 593826 \div3\div19\div5209=2
  • 642589\div313\div2053*2=2
  • 904024 \div2\div2\div11\div10273=2
  • 572674 \div43\div6659=2
  • 718422 \div3\div119737=2
  • 812732 \div2\div203183=2
  • 873256 \div2\div2\div17\div6421=2
  • 582947 \div 17\div53\div647*2=2

至于如何通过 C 站本题的测试,我也早已有了答案,只是对于这种题意和答案不符的情况,还是不吐(槽)不快。

好了,是非对错,有缘读到这里的读者自己判断吧。

也欢迎有人提出反对意见,毕竟胜负终归浮云,唯有真理越辩越明。

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

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

相关文章

彻底理解HTTPS加密原理

目录 1.为什么需要加密&#xff1f; 2.什么是对称加密&#xff1f; 3.什么是非对称加密&#xff1f; 4.非对称加密对称加密&#xff1f; 5.数字证书 6.数字签名 相信大家对于HTTP与HTTPS的区别都有了解&#xff0c;那么对于HTTPS的加密过程你是否知道呢&#xff1f; 对称…

单片机内存管理

单片机内存管理 1、随机存储器 RAM是随机存储器&#xff0c;读写速度快&#xff0c;但掉电以后数据会丢失。它分为SRAM(静态RAM)和DRAM(动态RAM)。SRAM无需刷新就可以保存数据&#xff1b;DRAM需要不断刷新才可以保存数据。在CPU内部的RAM&#xff0c;就叫内部RAM&#xff0c…

算法模板(3):搜索(4):高等图论

高等图论 有向图的强连通分量 相关概念 强连通分量&#xff1a;Strongly Connected Component (SCC).对于一个有向图顶点的子集 S S S&#xff0c;如果在 S S S 内任取两个顶点 u u u 和 v v v&#xff0c;都能找到一条 u u u 到 v v v 的路径&#xff0c;那么称 S S…

JVM零基础到高级实战之Java程序员不可不知的对象创建底层步骤细节

JVM零基础到高级实战之Java程序员不可不知的对象创建底层步骤细节 JVM零基础到高级实战之Java程序员不可不知的对象创建底层步骤细节 文章目录 JVM零基础到高级实战之Java程序员不可不知的对象创建底层步骤细节前言Java对象创建的流程步骤包括哪些&#xff1f;总结 前言 JVM零…

【云原生 | 53】Docker三剑客之Docker Compose应用案例一:Web负载均衡

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

基于Echarts构建停车场数据可视化大屏(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【部署LVS-DR 群集】

目录 一、DR模式 LVS负载均衡群集1、数据包流向分析2、DR 模式的特点 二、DR模式 LVS负载均衡群集部署1、1.配置负载调度器&#xff08;192.168.80.30&#xff09;&#xff08;1&#xff09;配置虚拟 IP 地址&#xff08;VIP&#xff1a;192.168.102.188&#xff09;&#xff0…

《设计模式》之装饰器模式

文章目录 1、定义2、动机3、类结构4、优缺点5、注意事项6、总结7、代码实现(C) 1、定义 动态&#xff08;组合&#xff09;地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码…

PPT中这8个隐藏技巧-掌握了马上让你幸福感满满

开篇 一个好的PPT需要精雕细琢。即使我们使用了AIGC特别是时下流行的用GPT书写大纲,然后把大纲内的内容放到一些自动GC PPT内容的生成器里生成后的PPT其实也不是马上可以拿来用的。工作上一份大领导、公司、集团级别的PPT不可能90%使用GPT GC生成就可以直接交付的。比如说我们…

Trie树模板与应用

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/algorithms-notes 】或者公众号【AIShareLab】回复 算法笔记 也可获取。 文章目录 Trie树&#xff08;字典树&#xff09;基本思想例题 Trie字符串统计code关于idx的理解 模板总结应用 最大异或对分…

初探BERTPre-trainSelf-supervise

初探Bert 因为一次偶然的原因&#xff0c;自己有再次对Bert有了一个更深层地了解&#xff0c;特别是对预训练这个概念&#xff0c;首先说明&#xff0c;自己是看了李宏毅老师的讲解&#xff0c;这里只是尝试进行简单的总结复述并加一些自己的看法。 说Bert之前不得不说现在的…

ansible远程执行指令,/bin/sh: java: command not foundnon-zero return code

问题描述&#xff1a;ansible远程执行指令&#xff0c;初选指令加载不全&#xff0c; [rootVM-0-6-centos ~]# ansible all -m shell -a "java -version" 10.206.0.15 | FAILED | rc127 >> /bin/sh: java: command not foundnon-zero return code 解决方案&a…

C++(8):IO 库

IO 类 IO 库类型和头文件 iostream 定义了用于读写流的基本类型&#xff0c;fstream 定义了读写命名文件的类型&#xff0c;sstream 定义了读写内存 string 对象的类型。 其中带 w 前缀的类型用来操作宽字符语言 (wchar_t)。宽字符版本的类型和函数前都有一个 w&#xff0c;如…

SAP从入门到放弃系列之PP/DS-part1

翻译一篇大佬文章&#xff0c;了解一下PPDS前世今生和产品功能出现的业务背景。虽然是15年的&#xff0c;但经典永流传~~~&#xff0c;感谢大佬的文章。 原文地址&#xff1a; #S4HANA 1610 use case series: 9a – Production Planning and Detailed Scheduling – PP/DS (b…

【MySQL学习笔记】子查询与联结(连接)

1.子查询 将一条select语句返回的结果用于另一条select语句的where子句中。 执行时&#xff0c;先执行子查询&#xff0c;再执行主查询。 select sid from sc where cid in (select cid from course where cname数据库应用技术);子查询一般与 IN 操作符结合使用&#xff0…

《微服务实战》 第三十二章 微服务链路跟踪-sleuth zipkin

前言 大型分布式微服务系统中&#xff0c;一个系统被拆分成N多个模块&#xff0c;这些模块负责不同的功能&#xff0c;组合成一套系统&#xff0c;最终可以提供丰富的功能。在这种分布式架构中&#xff0c;一次请求往往需要涉及到多个服务服务之间的调用错综复杂&#xff0c;对…

Lenovo Yoga-710-14IKB电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板Lenovo Yoga 710 (14") - 14IKB (without dGPU) 处理器Intel i5-7200U (4) 2.50GHz (IKBL)已驱动 内存48 GB ( 海盗船 DDR4 3200…

web worker创建多个 JavaScript 线程 (使用GTP写的文章)

前言 最近在优化公司的一个项目&#xff0c;使用的就是web worker去优化&#xff0c;做了那些优化&#xff0c;一个是状态的优化&#xff0c;&#xff08;通信的状态实时更新&#xff0c;以前的做法是做个定时任务实时获取它的状态&#xff0c;然后让它在页面渲染&#xff0c;这…

【Linux】 -- TCP协议 (一)

TCP协议 Tcp协议可靠性冯诺依曼体系结构 TCP的协议格式序号与确认序号窗口大小六个标志位 确认应答机制 &#xff08;ACK&#xff09;超时重传机制连接管理机制 Tcp协议 TCP全称为 “传输控制协议”&#xff08;Transmission Control Protocol&#xff09; TCP协议被广泛应用…

[linux_C语言_udp的多种实现方法及网络调试中遇到的问题]

linux_C语言_udp的多种实现方法 最基本的方式(不用组播不用sigio信号不使能广播属性)接收端发送端 使用SIGIO信号的方式(使用sigio信号使用广播使能属性)服务端客户端 使用组播模式服务端客户端 tcp和udp的使用区别调试中遇到的问题所有源码下载点这~~ 最基本的方式(不用组播不…