智力题(博弈论)

这篇博客探讨了几道有趣的博弈论智力题,包括涂色格子、赛马策略、棋子跳格子游戏、矩阵行走游戏以及清除数组游戏。通过案例分析,解释了如何在这些游戏中制定最优策略以获取胜利。涉及的关键点包括田忌赛马策略、Nim游戏理论和异或运算在判断游戏胜负中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

智力题

这里有几道博弈论的题目,自己在这方面的练习较少,缺乏系统训练,文末连接,有相关内容。

案例一

涂色1:你要在一个nxm的格子图上涂色,你每次可以选择一个未涂色的格子涂上你开始选定的那种颜色。同时为了美观,我们要求你涂色的格子不能相邻,也就是说,不能有公共边,现在问你,在采取最优策略的情况下,你最多能涂多少个格子?

给定格子图的长n和宽m。请返回最多能涂的格子数目。

测试样例:
1,2
返回:1

通过绘图,显示是二分之一

class Paint {
   
public:
    int getMost(int n, int m) {
   
        int k=m*n;
        return k%2==1?k/2+1:k/2;
    }
};
//答案
class Paint {
   
public:
    int getMost(int n, int m) {
   
        return (m*n+1)>>1;
    }
};
案例二

赛马:作为一个马场的主人,你要安排你的n匹赛马和另一个马场的n匹马比赛。你已经知道了对方马场的出战表,即参加每一场的马的强壮程度。当然你也知道你自己的所有马的强壮程度。我们假定比赛的结果直接由马的强壮程度决定,即更壮的马获胜(若相同则双方均不算获胜),请你设计一个策略,使你能获得尽量多的场次的胜利。

给定对方每场比赛的马的强壮程度oppo及你的所有马的强壮程度horses(强壮程度为整数,且数字越大越强壮)同时给定n,请返回最多能获胜的场次。

测试样例:
[1,2,3],[1,2,3],3
返回:2

方法1:这个题目解法,就是如果horse a存在大于未参赛的对方马,那就跟对方最大的弱于a的马比赛,胜场次+1;若a小于等于所有未参赛的对方马,那就选择未参赛的最大的马比赛。田忌赛马。
方法2: 这里我们不用考虑弱马战对方强马即平或输的情况,我们只要考虑清楚怎样获得最大的赢的次数,剩下的不管怎么样,随机排就可以。那,我们对双方马按战力排序,逆序找到能够赢的次数,之所以逆序找,是因为这样能使该赢的马赢得对方战力最大的马。跟方法1比,只是不用考虑弱马了,时间复杂度也变为了O(N)。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int winMost(vector<int> oppo, vector<int> horses, int n) {
   
	sort(horses.begin(),horses.end());
	vector<int>flag;
	flag.assign(oppo.size(),0);
	int c=0;
	for(int i=0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值