算法实验课回顾

田忌赛马

问题描述:

你一定听说过田忌赛马的故事吧?如果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: 这个算法对田姥爷太难输了…

内容来源于网络如有侵权请私信删除

田忌赛马贪心算法_田忌赛马 贪心算法相关推荐

  1. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  2. 【Matlab】智能优化算法_蚁狮优化算法ALO

    [Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...

  3. 【Matlab】智能优化算法_灰狼优化算法GWO

    [Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...

  4. prim算法_数据结构与算法

    根据MOOC上课程总结,文章目录为: 一.引论 数据结构的基本概念 数据的逻辑结构和存储结构 算法及其时间复杂度 时间复杂度及应用 二.线性表 线性表的概念及顺序存储 单链表的概念及其基本操作 建立单 ...

  5. xgboost算法_基于XGBoost算法构建投资组合

    摘要 极端梯度提升 (eXtreme Gradient Boosting) 是一种基于决策树的集成机器学习方法,适用于分类和回归问题.其优点是速度快.效果好.能处理大规模数据.支持自定义损失函数等. ...

  6. 机器学习 线性回归算法_探索机器学习算法简单线性回归

    机器学习 线性回归算法 As we dive into the world of Machine Learning and Data Science, one of the easiest and f ...

  7. python实现洗牌算法_洗牌算法及 random 中 shuffle 方法和 sample 方法浅析

    对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章 <扫雷与 ...

  8. hash算法_一致性hash算法简介

    一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...

  9. 一致性hash算法_分布式寻址算法

    一.分布式寻址算法简介 分布式寻址算法是很重要的内容,不了解这些算法,也就不能透彻的了解各种分布式中间件的原理.简单说一下这些高大上的寻址到底是个啥意思,比如在elasticsearch中,采用的是多 ...

最新文章

  1. Reactjs 的 PropTypes 使用方法
  2. 数组的相关操作2——筛选数组
  3. [EULAR文摘] 在总人群中监测ACPA能否预测早期关节炎
  4. spark算子大全glom_2小时入门Spark之RDD编程
  5. (译)Windsor入门教程---第三部分 编写第一个Installer
  6. 安装完centos6没有eth0,只有回环地址
  7. [译] 在 Android 使用协程(part III) - 在实际工作中使用
  8. 干货来袭!java从入门到精通第五版pdf
  9. javascript连接数据库
  10. 用场景应用™玩转#冰桶挑战#
  11. 锐捷AP组建无线网络-保姆级教程
  12. 洛谷blog传送门qwq
  13. 【深度学习训练流程】浅析深度学习训练流程
  14. Android中的Activity
  15. 良心分享 50 款程序员“神器级”的网站,你一定用得上,老少皆宜
  16. Mac 终端命令汇总
  17. javaScript:实现倒计时定时器setInterval的开始计时、暂停计时、停止计时效果
  18. 2019年最新版 省市区json数据 跟小程序省市区的数据同步
  19. 【Python】用vs code开发Python项目
  20. Netty 工作流程图梳理

热门文章

  1. ARM 的几个重要特点
  2. 区分HPUX是Itanium还是PA-RISC
  3. windows下安装程序制作
  4. LuoguP2617 Dynamic Rankings (动态主席树学习理解)
  5. day1作业(格式化输出)
  6. 《JavaEE开发的颠覆者——Spring Boot实战》是一本好书
  7. codeforces 610D D. Vika and Segments(离散化+线段树+扫描线算法)
  8. Sourse Insight使用教程及常见的问题解决办法
  9. 火狐拓展开发 基础知识
  10. inux php pdo mysql 扩展