SRM 594 DIV 2 - 2
枚举题,由于 A 和 B 是原数的比例,将原题重新叙述为:
已知集合 A 和 B,k1A 和 k2B 是 A、B 分别乘以 k1、k2 的数组。找到一组 (k1,k2) 使得 k1A 和 k2B 中不相同的数尽可能少,找到这个最小的数
k1,k2 无上限,不可能枚举所有的 k1,k2
最优情况下必然存在数 (a,b)∈(A,B) 使得 k1a=k2b,或者不存在则最优解直接为 len(A)+len(B)。
可令 (k1,k2)=(b,a),这是一组符合条件可能导出最优解的组合,因此算法如下:
枚举所有的 (a,b)∈(A,B),计算 bA+aB 中不同数的个数,取最小值。
现在的问题是,这样的枚举算法是否囊括了所有情况,或者至少囊括所有最优解的情况?
只需证明:
(k1,k2)=(pb,pa)(pb,pa∈N∗)求得的结果相同
于是,k1a=k2b 情况下只需取任意一组合法的 (k1,k2) 求解即可
1 from fractions import gcd 2 3 class AstronomicalRecordsEasy: 4 def minimalPlanets(self, a, b): 5 result = len(a) + len(b) 6 for x in a: 7 for y in b: 8 aa = [t*y for t in a] 9 bb = [t*x for t in b] 10 s = set(aa + bb) 11 result = min(result, len(s)) 12 return result 13 14 15 # test 16 o = AstronomicalRecordsEasy() 17 18 # test case 19 assert(o.minimalPlanets((1,2,3,4), (2,3,4,5)) == 5) 20 assert(o.minimalPlanets((1,2,3,4), (2,4,6,8)) == 4) 21 assert(o.minimalPlanets((1,2,3,5,6,8,9), (2,4,5,6,7,8,9)) == 9) 22 assert(o.minimalPlanets((1,2,3,4), (6,7,8,9)) == 6) 23 assert(o.minimalPlanets((200,500), (100,200,300,400,600,700,800,900)) == 9) 24 assert(o.minimalPlanets((1,2,3,4,5,6,7,8,9,10,11,12), (6,7,8,9,10,11,12,13,14,15)) == 15) 25 print('ok')
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!