问题描述

在8枚外观相同的硬币中,有一枚是假币,并且已知假币和真币的重量不同,但不知假币是轻还是重,用天平来任意比较两组硬币。

8枚硬币问题
1.把8枚硬币分为3、3、2三个部分

2.先判断前两个部分是否相等,相等则拿第三部分分别和一枚真币进行比较

3.如果不相等,同时从前两部分各拿走一枚硬币并交换一对硬币进行比较,如
a+b+c>d+e+f:如果去掉cf,并交换be,即左右两边分别为a+e,d+b。

如果a+e>b+d,说明拿走的硬币和交换的硬币并没有影响结果,说明假币在ad中,拿ad分别和一枚真币(如c)进行比较,如果a>c说明a为较重的假币,否则d为较轻的假币;

如果a+e==b+d,说明假币在拿走的两枚硬币中,即在cf,拿cf和一枚真币(比如a)进行比较,若c>a则说明c为较重的假币,否则f为较轻的假币;

如果a+e<b+d,说明是交换的硬币导致平衡状态的改变,即假币存在于be中,拿be分别和一枚真币(如a)进行比较,如果b>a说明b为较重的假币,否则说明e为较轻的假币。

代码如下

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
map<char,int> mp;
int sum(vector<int> v,int s,int e)
{int total = 0;for(int i=s;i<e;i++)total += v[i];return total;
}
void FakeCoinIndex(vector<int> v)
{//int x1 = (v.size()+2)/3;//int x2 = 2*x1;int x1 = 3;int x2 = 6;if(sum(v,0,x1)>sum(v,x1,x2)){int temp = v[1];v[1] = v[4];v[4] = temp;if(v[0]+v[1]==v[3]+v[4]) mp.insert(make_pair('H',2));else if(v[0]+v[1]>v[3]+v[4]) mp.insert(make_pair('H',0));else if(v[0]+v[1]<v[3]+v[4]){if(v[1]<v[0]) mp.insert(make_pair('L',4));else mp.insert(make_pair('H',1));}}else if(sum(v,0,x1)==sum(v,x1,x2)){if(v[6]>v[0]) mp.insert(make_pair('H',6));else if(v[6]<v[0]) mp.insert(make_pair('L',6));else if(v[7]>v[0]) mp.insert(make_pair('H',7));else if(v[7]<v[0]) mp.insert(make_pair('L',7));}else{int temp = v[1];v[1] = v[4];v[4] = temp;if(v[0]+v[1]==v[3]+v[4]) mp.insert(make_pair('L',2));else if(v[0]+v[1]<v[3]+v[4]) mp.insert(make_pair('L',0));else if(v[0]+v[1]>v[3]+v[4]){if(v[1]>v[0]) mp.insert(make_pair('H',4));else mp.insert(make_pair('L',1));}     }
}
int main()
{int m,n;cin >> n;vector<int> v;for(int i=0;i<n;i++){cin >> m;v.push_back(m);}FakeCoinIndex(v);map<char,int>::iterator it = mp.begin();cout << it->second <<" " << it->first <<endl;return 0;
}
/*
8
1 1 2 1 1 1 1 1
8
1 1 1 1 0 1 1 1
*/

n枚硬币问题
遇到的问题:刚开始只写了n-m=1 和 n-m=2 的情况,但是如果假币正好属于n-m=1的情况就直接返回了,没有被处理,导致结果有纰漏。后来加上了n-m=3的情况。
代码如下:

#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<algorithm>
using namespace std;map<int,char> mp;
void CoinIndex(vector<int> v,int m,int n) //左闭右开
{int mid = (m+n)/2;if(n-m==1) return;if(n-m==3){if(v[m]==v[m+1]){if(v[m+2]>v[m]) mp.insert(make_pair(m+2,'H'));else if(v[m+2]<v[m]) mp.insert(make_pair(m+2,'L'));}else if(v[m]<v[m+1]){if(v[m]==v[m+2]) mp.insert(make_pair(m+1,'H'));else mp.insert(make_pair(m,'L'));}else if(v[m]>v[m+1]){if(v[m]==v[m+2]) mp.insert(make_pair(m+1,'L'));else mp.insert(make_pair(m,'H'));}}else if(n-m==2){if(v[m]==v[m+1]) return;else if(v[m]>v[m+1]){if(m!=0){if(v[m]>v[0]) mp.insert(make_pair(m,'H'));else mp.insert(make_pair(m+1,'L'));}else{if(v[m]>v[n]) mp.insert(make_pair(m,'H'));else mp.insert(make_pair(m+1,'L'));}}else if(v[m]<v[m+1]){if(m!=0){if(v[m]<v[0]) mp.insert(make_pair(m,'L'));else mp.insert(make_pair(m+1,'H'));}else{if(v[m]<v[n]) mp.insert(make_pair(m,'L'));else mp.insert(make_pair(m+1,'H'));}}}CoinIndex(v,m,mid);CoinIndex(v,mid,n);
}
int main()
{int m,n;while(cin >> n){vector<int> v;mp.clear();for(int i=0;i<n;i++){cin >> m;v.push_back(m);}CoinIndex(v,0,n);map<int,char>::iterator it = mp.begin();cout << it->first << " " << it->second<<endl<<endl;}return 0;
}

【算法设计与分析】8枚硬币及n枚硬币问题相关推荐

  1. 算法设计与分析: 4-11 硬币找钱问题

    4-11 硬币找钱问题 问题描述 设有 6 种不同面值的硬币,各硬币的面值分别为 5 分,1 角,2 角,5 角,1 元,2 元. 现要用这些面值的硬币来购物和找钱.购物时可以使用的各种面值的硬币个数 ...

  2. C/C++ 算法设计与分析实验报告

    算法设计与分析实验报告 算法实验整体框架的构建 菜单代码块 选择函数代码块 主函数代码块 实验模块Ⅰ:算法分析基础--Fibonacci序列问题 实验解析 Fibonacci序列问题代码块 实验模块Ⅱ ...

  3. 算法设计与分析基础-笔记-上

    算法设计与分析基础 绪论 什么是算法 一系列解决问题的明确指令,对于符合一定规范的输入,能够在有限的时间内获得要求的输出. 例子:最大公约数:俩个不全为0 的非负整数 m m m和 n n n的最大公 ...

  4. 【算法设计与分析】经典常考三十三道例题AC代码

    ❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...

  5. 算法设计与分析: 1-4 金币阵列问题

    1-4 金币阵列问题 问题描述 有m*n枚金币在桌面上排列成一个m行n列的金币阵列.每一枚金币或正面朝上,或背面朝上.用数字表示金币状态,0表示正面朝上,1表示背面朝上. 金币阵列游戏的规则是: (1 ...

  6. 算法设计与分析------蛮力法

    算法设计与分析------蛮力法(c语言) 一.蛮力法(穷举法 枚举法) 1.定义 2.蛮力法使用情况 3.蛮力法的优点 4.蛮力法的缺点 5.采用蛮力法设计算法的2类: 6.简单选择排序和冒泡排序 ...

  7. 算法设计与分析课后总结

    算法设计与分析课后总结 算法设计与分析 第1章 算法设计基础 课后习题 第二章算法分析基础 课后习题 1.考虑下面算法,回答下列问题,算法完成什么功能?算法的基本语句时什么?基本语句执行了多少次? 2 ...

  8. 算法设计与分析: 5-14 独立钻石跳棋问题

    5-14 独立钻石跳棋问题 问题描述 独立钻石跳棋的棋盘上有 33 个方格,每个方格中可放 1 枚棋子.棋盘中最多可摆放 32枚棋子.下棋的规则是任一棋子可以沿水平或垂直方向跳过与其相邻的棋子进入空着 ...

  9. 【算法设计与分析】求解查找假币问题

    文章目录 前言 题目描述 解题思路 参考代码 总结 前言 <算法设计与分析>的实验,稍微记录一下,欢迎讨论. 题目描述 编写一个实验程序查找假币问题.有n(n>3)个硬币,其中有一个 ...

  10. 算法设计与分析(电子科技大学)(上)算法基础和贪心算法

    算法分析与设计 引论 (1)理解算法和程序的差别 (2)理解判断问题和优化问题这两类计算问题 1.理解指数增长的规模 2.理解渐进表达式 掌握渐进符号Ο.Θ.Ω的含义,能判断一个函数属于哪个渐近增长阶 ...

最新文章

  1. 认证与Shiro安全框架
  2. 黑客道诠释完整版1-7
  3. Martix工作室考核题 —— 输入一串数字,按要求打印。
  4. 开源服务容错处理库Polly使用文档
  5. linux(windows)之svn重定向地址
  6. pythondev更新到3_python版本升级到3.7
  7. 对象序列化Java中的序列化
  8. AngularJS 模板
  9. android手势解锁代码,纯android代码实现九宫格手势密码
  10. 效率直接起飞的PPT技巧,你知道吗
  11. python处理考勤数据_python连接中控考勤机分析数据
  12. Java--Files
  13. 所有图片类型后缀汇总
  14. android定时上传视频,【安卓按键精灵】定时执行指定任务
  15. 超全MES系统知识普及,必读此文
  16. Web大学生网页作业成品——易购商城网站设计与实现(HTML+CSS+JavaScript)
  17. node.js常用模块
  18. MYSQL-计算两个时间的时间差和工作日差
  19. py使用polar绘制霍兰德职业测试雷达图
  20. 第四章 MPT 现代组合理论

热门文章

  1. 陈凯歌: 大创意大《无极》
  2. scroll-top 设置微信小程序滚动条位置
  3. laya的tween的坑
  4. 现在完成时与其他时态的区别
  5. 成都学python哪个机构好_成都学python人工智能哪个机构好
  6. 用Silverlight做淘宝应用
  7. 电脑解锁后黑屏有鼠标_电脑黑屏后屏幕只有鼠标怎么办呢?
  8. 冻结训练和解冻训练的区别
  9. Pixel修改kernel内核调试
  10. 优酷弹幕穿人「渲染技术」揭秘