田忌赛马贪心算法_田忌赛马 贪心算法
算法实验课回顾
田忌赛马
问题描述:
你一定听说过田忌赛马的故事吧?如果3匹马变成n匹(n<=100),齐王仍然让他的马按照优到劣的顺序初赛,田忌可以按任意顺序选择他的赛马出赛。赢一局,田忌可以得到200两银子;输一局,田忌就要输掉200两银子。已知道国王和田忌的所有马的奔跑速度,并且所有马的奔跑速度均不相同,现已经对两人的马分别从快到慢排好序。请设计一个算法,帮助田忌赢得最多的银子。
要求:
输入:第一行一个整数n,表示双方各有n匹马;
第二行n个整数分别表示田忌的n匹马的速度;
第三行n个整数分别表示齐王的n匹马的速度。
输出:若通过聪明的你精心安排,如果能赢得比赛(赢的次数大于比赛总次数的一半),那么输出“YES”。 否则输出“NO”。并输出一个整数,代表田忌最多能赢多少两黄金。
如果田忌最快的马比齐王最快的马快,则比之
如果田忌最快的马比齐王最快的马慢,则用田最慢的马跟齐最快的马比
// 这是贪心的第一步
如果田忌最快的马的速度与齐威王最快的马速度相等
如果田忌最慢的比齐威王最慢的快,则比之
// 这是贪心的第二步
如果田忌最慢的比齐威王最慢的慢,田忌慢VS齐王快
田忌最慢的与齐威王最慢的相等,田忌慢VS齐王快
代码 C++实现
#include
#include
using namespace std;
// 快排
void Quick(int a[], int begin, int end) {
if (begin >= end)
return;
int t = a[begin];
int i = begin;
int j = end;
while (i < j)
{
while (i
j--;
a[i] = a[j];
while (i < j && a[i] >= t)
i++;
a[j] = a[i];
}
a[i] = t;
Quick(a, begin, i - 1);
Quick(a, i + 1, end);
}
// 田忌赛马算法
int tianRac(int Tian[], int King[], int n) {
int money = 0; // 田忌赢的钱
int tianh = 0, tiane = n-1, kingh = 0, kinge = n-1;// 分别标记田忌马队和齐王马队的最快和最慢的马
// 共有 n 次比赛,每进行一次,就换下一匹马(田姥爷就位,开始赛马秀)
for (int i = 0; i < n; i++) {
// 田忌快马比齐王快马快时,那就和他一较高下(赌怪,必赢)
if (Tian[tianh] > King[kingh]) {
money += 200;
tianh++;// 下一个
kingh++;// 下一个
}
// 田忌快马比齐王快马慢时,用最慢的马跟他最快的比(埋伏他一手,这匹马不用抢,他死定了,反手一个超级加倍,闷声发大财)
else if (Tian[tianh] < King[kingh]) {
money -= 200;
tiane--;
kingh++;
}
// 田忌的快马和齐王的快马一样快时(他也一样快?不过不用怕,他的马赢不了我)
else {
// 田忌的慢马比齐王的慢马快时(很牛逼这个马)
if (Tian[tiane] > King[kinge]) {
money += 200;
tiane--;
kinge--;
}
// 田忌的慢马比齐王的慢马一样快和慢时,就用慢马和他快马比(如果将这个慢马换成快马我的马将绝杀,可惜换不得)
else {
money -= 200;
tiane--;
kingh++;
}
}
}
// 返回田忌赢的钱(飞机~)
return money;
}
int main() {
int n;// 比赛双方马的数量
cout << "公等马几何" << endl;
cin >> n;
int* Tian = new int[n];
int* King = new int[n];
cout << "将军 马之疾" << endl;
for (int i = 0; i < n; i++) {
cin >> *(Tian + i);
}
cout << "王 马之疾" << endl;
for (int i = 0; i < n; i++){
cin >> *(King + i);
}
// 排序,降序排
Quick(Tian, 0, n-1);
Quick(King, 0, n - 1);
// 调用“就算佛祖来了,田姥爷也难输”算法
int result = tianRac(Tian, King, n);
if (result > 0) {
cout << "将军 胜" << endl;
cout << "赢 " << result << "金" << endl;
}
else if (result == 0)
{
cout << "和" << endl;
}
else {
cout << "王 胜" << endl;
cout << "赢 " << -result << "金" << endl;
}
return 0;
}
测试数据:
95 92 80 85 98 86 81 83
88 89 97 99 82 85 90 91
80 79 90 95 78 85 68 91
95 92 99 85 98 86 85 96
结果截图:
ps: 这个算法对田姥爷太难输了…
内容来源于网络如有侵权请私信删除
田忌赛马贪心算法_田忌赛马 贪心算法相关推荐
- 【Matlab】智能优化算法_蜻蜓优化算法DA
[Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...
- 【Matlab】智能优化算法_蚁狮优化算法ALO
[Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...
- 【Matlab】智能优化算法_灰狼优化算法GWO
[Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...
- prim算法_数据结构与算法
根据MOOC上课程总结,文章目录为: 一.引论 数据结构的基本概念 数据的逻辑结构和存储结构 算法及其时间复杂度 时间复杂度及应用 二.线性表 线性表的概念及顺序存储 单链表的概念及其基本操作 建立单 ...
- xgboost算法_基于XGBoost算法构建投资组合
摘要 极端梯度提升 (eXtreme Gradient Boosting) 是一种基于决策树的集成机器学习方法,适用于分类和回归问题.其优点是速度快.效果好.能处理大规模数据.支持自定义损失函数等. ...
- 机器学习 线性回归算法_探索机器学习算法简单线性回归
机器学习 线性回归算法 As we dive into the world of Machine Learning and Data Science, one of the easiest and f ...
- python实现洗牌算法_洗牌算法及 random 中 shuffle 方法和 sample 方法浅析
对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章 <扫雷与 ...
- hash算法_一致性hash算法简介
一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...
- 一致性hash算法_分布式寻址算法
一.分布式寻址算法简介 分布式寻址算法是很重要的内容,不了解这些算法,也就不能透彻的了解各种分布式中间件的原理.简单说一下这些高大上的寻址到底是个啥意思,比如在elasticsearch中,采用的是多 ...
最新文章
- Reactjs 的 PropTypes 使用方法
- 数组的相关操作2——筛选数组
- [EULAR文摘] 在总人群中监测ACPA能否预测早期关节炎
- spark算子大全glom_2小时入门Spark之RDD编程
- (译)Windsor入门教程---第三部分 编写第一个Installer
- 安装完centos6没有eth0,只有回环地址
- [译] 在 Android 使用协程(part III) - 在实际工作中使用
- 干货来袭!java从入门到精通第五版pdf
- javascript连接数据库
- 用场景应用™玩转#冰桶挑战#
- 锐捷AP组建无线网络-保姆级教程
- 洛谷blog传送门qwq
- 【深度学习训练流程】浅析深度学习训练流程
- Android中的Activity
- 良心分享 50 款程序员“神器级”的网站,你一定用得上,老少皆宜
- Mac 终端命令汇总
- javaScript:实现倒计时定时器setInterval的开始计时、暂停计时、停止计时效果
- 2019年最新版 省市区json数据 跟小程序省市区的数据同步
- 【Python】用vs code开发Python项目
- Netty 工作流程图梳理