真币与假币的重量问题

news/2024/10/17 18:20:20/

        现有八枚硬币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重。
  单独求假币的问题是不难的,但问题是“限制使用最少的比较次数”,所以我们不能以单纯的回圈比较来求解,我们可以使用决策树(decision tree),使用分析与树状图来协助求解。一个简单的状况是这样的:
  1)我们比较a+b+c与d+e+f ,
  如果相等,则假币必是g或h,我们先比较g或h哪个较重,如果g较重,再与x比较(x代指真币,且每一步必能找到一块真币),
  1.1)若 g=x,从而g为真币,h为假币,则"真币较重,假币较轻";
  1.2)若 g>x,从而g为假币,h为真币,则"真币较轻,假币较重";
  1.3)若 g<x,从而g为假币,h为真币,则"真币较重,假币较轻",推出g是假币同时g较轻,这与g较重的前提条件矛盾,所以g<x这种情况不存在;
  若选重的一方与真币进行比较,则结果只有等于和大于这2种情况,即只有1.1) 和1.2)这2种情况,即只有2个分支:等于=和 大于>。
  1.4)同理,在第1)步时,若h较重,仿照1.1)、1.2)进行操作即可。
  2)若a+b+c ≠ d+e+f,假设a+b+c较重(即a+b+c > d+e+f),比较 a+b 与 d+e的大小,
  2.1)若 a+b = d+e,则说明d为真币(无差价,必为真币,这里的"价格"代指重量),令x=“真币重量”=d,
  再将c与x进行比较,即与真币进行比较:
  若 c=x,则c为真币,f为假币,推出“真币较重,假币较轻”;
  若 c>x,则c为假币,f为真币,推出“真币较轻,假币较重”,
  情况c< x 不存在;
  2.2)若 a+b > d+e,则说明f为真币(无差价,必为真币),令x=“真币重量”=f,
  再将a与x进行比较:
  若 a=x,则a为真币,b为假币,推出“真币较重,假币较轻”;
  若 a>x,则a为假币,b为真币,推出“真币较轻,假币较重;
  情况a<x 不存在;
  2.3)同理,在第2)步时,若d+e+f较重,仿照2.1)、2.2)进行操作即可。
  由上面的推理知,至少需要 2+1 = 3步,才能在8块硬币中找出一块假币。
  详细代码如下:
  //Coins.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>void compare(int[], int, int, int);
void eightcoines(int[]);int main(void){int coins[8] = { 0 };int i;srand(time(NULL));for (i = 0; i < 8; i++){coins[i] = 10;}printf("\n输入假币重量(比10大或小): ");scanf("%d", &i);coins[rand() % 8] = i;eightcoines(coins);printf("\n\n列出所有钱币重量: ");for (i = 0; i<8; i++)printf("%d ", coins[i]);printf("\n");system("pause");return 0;
}void compare(int coins[], int i, int j, int k){if (coins[i] == coins[k]) //这里的k代表已验证的真币{if (coins[j] > coins[k]) {printf("\n假币 %d 较重", j + 1);}else {printf("\n假币 %d 较轻", j + 1);}}else if (coins[i] > coins[k]){printf("\n假币 %d 较重", i + 1);}else if (coins[i] < coins[k]){printf("\n假币 %d 较轻", i + 1);}		
}void eightcoines(int coins[]){if (coins[0] + coins[1] + coins[2] ==coins[3] + coins[4] + coins[5]){compare(coins, 6, 7, 0);}else if (coins[0] + coins[1] + coins[2] >coins[3] + coins[4] + coins[5]){if (coins[0] + coins[3] == coins[1] + coins[4])compare(coins, 2, 5, 7);else if (coins[0] + coins[3] > coins[1] + coins[4])compare(coins, 0, 4, 7);else if (coins[0] + coins[3] < coins[1] + coins[4])compare(coins, 1, 3, 7);}else if (coins[0] + coins[1] + coins[2] <coins[3] + coins[4] + coins[5]){if (coins[0] + coins[3] == coins[1] + coins[4])compare(coins, 2, 5, 7);else if (coins[0] + coins[3] > coins[1] + coins[4])compare(coins, 3, 1, 7);else if (coins[0] + coins[3] < coins[1] + coins[4])compare(coins, 4, 0, 7);}
}

效果如下:

图(1) 第一种情况:真币较轻,假币较重

图(2) 第二种情况:真币较重,假币较轻


http://www.ppmy.cn/news/533358.html

相关文章

【Rust】1、实战:语法和数据结构、生命周期-所有权-借用、自制 CPU、内存、文件

文章目录 零、Rust 好用的资源一、概述1.1 安全性1.1.1 垂悬指针1.1.2 数据竞争1.1.3 迭代器失效 1.2 性能1.3 vscode 設置 二、基础语法2.1 循环2.2 引用2.3 生命周期2.4 泛型2.5 实战grep项目2.6 数组2.6.1 数组和切片2.6.2 动态数组2.6.3 初始化 2.7 包含第三方库2.8 命令行…

【Linux】MySQL 高级 SQL 语句 (二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MySQL 高级 SQL 语句 连接查询CREATE VIEW 视图UNION 联集交集值无交集值CASE空值(NULL) 和 无值() 的区别正则表达式 连接查询 mysql> select * from xjz; #xjz表格 ---…

【Redis】Lua的基础入门与使用

目录 一、什么是Lua 二、变量与循环 1、数据类型 2、变量的声明 3、循环 三、条件控制与函数 1、函数 2、条件控制 一、什么是Lua 他是一种轻量小巧的脚本语言&#xff0c;是一门用c语言编写的用c语言解析执行的高级语言。lua运行时把lua脚本编译成字节码&#xff0c;调…

46_ue4进阶末日生存游戏开发[储物箱重叠结束事件bug]

储物箱重叠结束事件&#xff0c;连续反应两次。 原因是角色有两个碰撞盒子组件 解决&#xff1a; 我们设置外层碰撞盒子的碰撞预设如下 bug解决。

45_ue4进阶末日生存游戏开发[储物箱点击功能]

在储物箱ui蓝图里的该函数&#xff0c;绑定一个事件 添加函数 为该函数添加输入 首先判断是不是左键点击 然后判断背包是否有空间添加 添加成功后&#xff0c;调用cabinet的remove函数 右键点击依然要调用remove函数 绑定函数 测试成功。

多线程注意事项

退出程序时等待多线程完成 QObject::connect(QApplication::instance(), &QApplication::aboutToQuit, [this]() {// 判断 QtConcurrent::run 是否在运行if (future.isRunning()) {// 等待任务完成future.waitForFinished();} });

训练2 寻找空储物箱子 (通过数组的length属性,可获得数组的长度)

训练2 寻找空储物箱子 超市有20个储物箱&#xff0c;现第2、3、5、8、12、13、16、19、20号尚未使用&#xff0c;使用数组的长度分别输出尚未使用的储物箱个数&#xff0c;以及已经使用的储物箱个数。 /*训练2 寻找空储物箱子* 超市有20个储物箱&#xff0c;现第2、3、5、8、1…

基于单片机的超市储物柜设计_基于单片机的新型智能储物柜设计

本系统由键盘、电机驱动与控制、液晶显示、上位机实时监控等几部分构成。系统上电时。LCD显示提示语“请选择操作方式”,此时等待您键入“存”或“取”,若为“存”则柜门自动打开等待用户放入要存的物品;此时LCD显示“请设置密码”,等待用户键入密码;按“确定”键后柜门自…