田忌赛马新思路

        前言         

        最近在看算法准备二战蓝桥杯,当我看到使用贪心算法做的时候我感觉有点不好理解,由于是我自己按照我的想法写了一下。

        思路

        赛马比赛的胜利是胜利的场数大于对方,所以我们知道如果有n匹马,最少要有n/2+1匹马比对方快,所以只需我们最快的n/2+1匹马比对方最慢的n/2+1匹马快就可以了,其余的获胜情况都是建立在这个最小获胜马匹数上的。那么思路如下。

        1.先对双方的马进行排序,从小到大,可以使用sort函数。

        2.我方的马匹最大是从n/2到n,对方最小马匹数是从1到n/2+1。

        3.使用for循环进行比较统计,如果我方的马匹速度较大者的数量为n/2+1则说明我方胜利,其余情况均为失败(包括平局和失败)。

        4.代码如下

#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 30
int a[MAXN];
int b[MAXN];
int n;
bool success(int* a,int* b,int n) {
	int r = n / 2 + 1;
	int l = n / 2 ;
	int num = 0;
	sort(a + 1, a + n );
	sort(b + 1, b + n );

	for (int i = 1; i <=r; i++)
	{
		if (a[i+l]>b[i])
		{
			num++;
		}
	}
	if (num==r)
	{
		return true;
	}
	return false;
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i] >> b[i];
	}
	if (success(a,b,n))
	{
		cout << "胜利";
	}
	else
	{
		cout << "失败";
	}
	return 0;
}

 这是我的第二篇博客希望之后的蓝桥杯考试可以顺利。谢谢大家的观看与学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值