经典算法---渊子赛马

描述

赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为“战国时期”。在魏国作官的孙膑,因为受到同僚庞涓的迫害,被齐国使臣救出后,到达齐国国都。

赛马是当时最受齐国贵族欢迎的娱乐项目。上至国王,下到大臣,常常以赛马取乐,并以重金赌输赢。田忌多次与国王及其他大臣赌输赢,屡赌屡输。一天他赛马又输了,回家后闷闷不乐。孙膑安慰他说:“下次有机会带我到马场看看,也许我能帮你。”

孙膑仔细观察后发现,田忌的马和其他人的马相差并不远,只是策略运用不当,以致失败。

比赛前田忌按照孙膑的主意,用上等马鞍将下等马装饰起来,冒充上等马,与齐王的上等马比赛。第二场比赛,还是按照孙膑的安排,田忌用自己的上等马与国王的中等马比赛,在一片喝彩中,只见田忌的马竟然冲到齐王的马前面,赢了第二场。关键的第三场,田忌的中等马和国王的下等马比赛,田忌的马又一次冲到国王的马前面,结果二比一,田忌赢了国王。

就是这么简单,现在渊子也来赛一赛马。假设每匹马都有恒定的速度,所以速度大的马一定比速度小的马先到终点(没有意外!!)。不允许出现平局。最后谁赢的场数多于一半(不包括一半),谁就是赢家(可能没有赢家)。渊子有N(1≤N≤1000)匹马参加比赛。对手的马的数量与渊子马的数量一样,并且知道所有的马的速度。聪明的你来预测一下这场世纪之战的结果,看看渊子能否赢得比赛。

输入

输入有多组测试数据。

每组测试数据包括3行:

第一行输入N(1≤N≤1000)。表示马的数量。

第二行有N个整型数字,即渊子的N匹马的速度。

第三行有N个整型数字,即对手的N匹马的速度。

当N为0时退出。

输出

若通过聪明的你精心安排,如果渊子能赢得比赛,那么输出“YES”。

否则输出“NO”。

样例输入

5

2 3 3 4 5

1 2 3 4 5

4

2 2 1 2

2 2 3 1

0

样例输出

YES

NO

#include <stdio.h>

//对数组进行输入

void inPut(int a[],int n)

{

int i;

for(i=0;i<n;i++)

{

scanf("%d",&a[i]);

}

}

//使用冒泡排序,将两人的马按速度从小到大进行排序。

void sort(int a[],int n)

{

int i,j,t;

for(i=1;i<n;i++)

{

for(j=0;j<n-i;j++)

{

if(a[j]>a[j+1])

{

t=a[j+1];

a[j+1]=a[j];

a[j]=t;

}

}

}

}

int main()

{

int n,i,a[1002],b[1002],t_max,t_min,q_max,q_min,win;

double h;

while(scanf("%d",&n)!=EOF&&n!=0)

{

//输入数据

inPut(a,n);

inPut(b,n);

//从小到大排序

sort(a,n);

sort(b,n);

//定义齐王和田忌的信息

//

//田忌的马的最大速度与最小速度

t_max=n-1;

t_min=0;

//齐王的马的最大速度与最小速度

q_max=n-1;

q_min=0;

//田忌胜利的局数

win=0;

//比较n次

for(i=0;i<n;i++)

{

//将田忌速度最小的马和齐王速度最小的马进行比较

//如果齐王赢,进行下一轮一比较,将双方的角标加一,胜利的次数加一

if(a[t_min]>b[q_min])

{

t_min++;

q_min++;

win++;

}

//如果田忌最小的马速度小于齐王,则隐形的将田忌速度最小的马与齐王速度最大的马进行比较,将田忌角标加一,齐王角标减一。

else if(a[t_min]<b[q_min])

{

t_min++;

q_max--;

}

else

{

//如果齐王和田忌最小速度的两匹马速度相同,则比较他两速度最大的两匹马。

//如果田忌最大速度的马比齐王快。则将双方角标减一,胜利次数加一

if(a[t_max]>b[q_max])

{

t_max--;

q_max--;

win++;

}

//如果田忌最大速度的马比齐王慢。则将齐王角标减一,田忌角标加一

else if(a[t_max]<b[q_max])

{

q_max--;

t_min++;

}

//如果两人速度最大的马的速度相等,则将田忌最小速度和齐王最大速度比较,田忌角标加一,齐王角标减一

else

{

if(a[t_min]<a[q_max])

{

t_min++;

q_max--;

}

}

}

}

//如果田忌胜利的次数大于所有次数的一半,则输出yes,否则no

h=n/2;

if(win>h)

printf("YES\n");

else printf("NO\n");

}

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-21 08:48:42

经典算法---渊子赛马的相关文章

[华为机试练习题]27.渊子赛马

题目 描述: 题目描述 赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为"战国时期".在魏国作官的孙膑,因为受到同僚庞涓的迫害,被齐国使臣救出后,到达齐国国都. 赛马是当时最受齐国贵族欢迎的娱乐项目.上至国王,下到大臣,常常以赛马取乐,并以重金赌输赢.田忌多次与国王及其他大臣赌输赢,屡赌屡输.一天他赛马又输了,回家后闷闷不乐.孙膑安慰他说:"下次有机会带我到马场看看,也许我能帮你." 孙膑仔细观察后发现,田忌的马和其他人的马相差并不远,只是

渊子赛马

赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为"战国时期".在魏国作官的孙膑,因为受到同僚庞涓的迫害,被齐国使臣救出后,到达齐国国都. 赛马是当时最受齐国贵族欢迎的娱乐项目.上至国王,下到大臣,常常以赛马取乐,并以重金赌输赢.田忌多次与国王及其他大臣赌输赢,屡赌屡输.一天他赛马又输了,回家后闷闷不乐.孙膑安慰他说:"下次有机会带我到马场看看,也许我能帮你." 孙膑仔细观察后发现,田忌的马和其他人的马相差并不远,只是策略运用不当,以致失败.

OJ刷题---渊子赛马

题目要求: 输入代码: #include<iostream> using namespace std; const int MAX=1000; int main() { int n,a[MAX],b[MAX]; while(cin>>n&&n)//n为0时停止循环 { int i,j,sum,num;//sum是渊子赢得场数,num是他人赢的场数 for(i=0; i<n; i++) { cin>>a[i]; } for(i=0; i<n;

AOJ 5.渊子赛马

贪心算法 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 6 #define REP(n) for(int o=0;o<n;o++) 7 8 bool Do() { 9 const int maxn = 1005; 10 int N;//马的数量 11 int a[maxn];//渊子的马 12 int b[maxn];//对手的马 1

数据挖掘十大经典算法

一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3 算法.   C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足: 2) 在树构造过程中进行剪枝: 3) 能够完成对连续属性的离散化处理: 4) 能够对不完整数据进行处理. C4.5算法有如下优点:产生的分类规则易于理解,准确率较高.其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导

动态展示十大经典算法

算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个项目要Ο(nlogn)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1.从数列中挑出一个元素,称为“基准”(pivot),

白话经典算法系列之七 堆与堆排序

堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)不论什么一个子节点的键值. 2.每一个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于不论什么一个子节点的键值时为最大堆.当父结点的键值总是小于或等于不论什么一个子节点的键值时为最小堆.下图展示一个最小堆

经典算法mark

在平时找工作的时候,或多或少会遇到一些算法问题,很多都是比较经典或者网上已经流传很久的.只是我们没有接触过,所以不知道怎么解决. 在这儿,我自己总结一些我遇到的一些经典算法,给自己增加一点记忆,也给需要的朋友看到学习一下. 1. 倒水问题 如题:一个容量为5升的杯子和一个容量为3升的杯子,水不限使用,要求精确得到4升水. 这类题一般会有两种出题方式: A.简答 这儿先给出简答的答案:其实结果又很多种,这儿给出倒水次数最少的一种. B.编程实现 解法也比较多,我首先想到的DFS(深度优先)搜索,每

经典算法宝典——动态规划思想(六)(2)

1.01背包问题 有N件物品和一个容量为V的背包,第i件物品的体积是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 解析: 这是最基础的背包问题,特点是每种物品仅有一件,可以选择放或不放.用子问题定义状态,即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.其状态转移方程便是f[i][v] = max{f[i-1][v], f[i-1][v-c[i]]+w[i]},这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的,所以有必要将它详细解