算法 POJ1029
一题目大意假币描述“金条”银行从可靠来源收到的信息在他们最后一组的 N 枚硬币中恰好有一枚硬币是假的并且重量与其他硬币不同而所有其他硬币的重量都相同。经济危机之后他们只有一个简单的余额可用如图所示。使用此天平可以确定左侧盘中物体的重量是否小于、大于或等于右侧盘中物体的重量。为了检测假币银行员工用从 1 到 N 的整数对所有硬币进行编号从而为每个硬币分配一个唯一的整数标识符。之后他们开始在左盘和右盘中放置相同数量的硬币对各种硬币组进行称重。硬币的标识符和加权结果被仔细记录下来。您将编写一个程序帮助银行员工使用这些加权结果确定假币的标识符。输入输入文件的第一行包含两个整数 N 和 K用空格分隔其中 N 是硬币的数量 2N1000 K 是完成的加权数量 1K100。以下 2K 行描述了所有权重。两条连续的线描述每个权重。第一个以数字 Pi 1PiN/2 开头代表放置在左侧和右侧盘中的硬币数量然后是放置在左侧盘中的硬币的 Pi 标识符和放置在右侧盘中的硬币的 Pi 标识符。所有数字都用空格分隔。第二行包含以下字符之一、 或 “。它表示加权的结果 表示左盘中硬币的重量小于右盘中硬币的重量 表示左盘中硬币的重量大于右盘中硬币的重量 表示左盘中硬币的重量等于右盘中硬币的重量。输出将假币的标识符写入输出文件如果给定加权的结果无法找到则为 0。样本输入5 32 1 2 3 41 1 41 2 5示例输出3二题意理解与分析这是一道通过对天平称重结果进行分析来找出假币的问题并非运用特定经典算法如dijkstra算法等的变形题。问题中已知有N枚硬币2 N 1000其中仅有1枚为假币且与其他真币重量不同通过对不同硬币组合进行K次1 K 100称重每次称重记录左右盘放置的硬币数量及具体硬币标识符以及称重结果左盘重量小于、大于或等于右盘重量。我们需要根据这些称重信息设计程序来确定假币的标识符若无法明确则输出0。解题的关键在于合理利用数组记录每次称重对各硬币“重量特征”的影响以及标记真币进而通过对这些数据的分析判断出假币。三算法思路分析首先初始化记录硬币 “权重变化” 的weight数组和标记真币的flag数组为 0 。接着读取硬币数量n和称重次数k对每次称重记录左右盘硬币数量和编号并依据称重结果进行处理若结果为 “”则将对应硬币标记为真币若为 “” 或 “”则相应增减左右盘硬币在weight数组中的值并记录称重次数。最后遍历所有未标记为真币的硬币若其weight值等于或为负的称重次数则认为可能是假币统计可能假币数量若数量大于 1 则无法确定假币输出 0 否则输出该可能假币的编号。四源代码五总结通过编写解决“金条”银行假币检测问题的程序巩固了对数据结构和逻辑推理的运用在代码中利用数组记录硬币称重相关信息并进行分析处理以找出假币。虽未涉及贪心选择算法和分治法但此次实践锻炼了解决问题的能力让我明白不能思维固化要根据不同问题灵活运用方法牢记算法性质、场景和步骤从而扩展解题思维广度例如本题根据称重结果巧妙标记和统计来确定假币为今后解决类似问题积累了经验。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2453324.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!