中超9 hdu 7067 Just another board game (博弈,最优策略)

49 篇文章 1 订阅
5 篇文章 0 订阅
hdu 7067 Just another board game
题意:
  • n ∗ m n*m nm 的棋盘,每个位置 1 1 1 个数字,初始 ( 1 , 1 ) (1,1) (1,1)

    R R R K K K 轮流操作,R可以将棋子移动到同一行的任何位置(可以原位置), K K K可以将棋子移动到同一列的任何位置

  • 游戏进行 k k k 轮,也可以在每一轮操作前 R R R K K K选择结束游戏,结束的位置的数值为最终价值

    R R R 想最大化价值, K K K 反之

  • 两人都是最优策略,求最终价值

思路:
  • 显然是一个博弈题

  • 考虑先手 R R R :因为 K K K 是同一列最小化,所以 R R R 最优策略会移动到 同列上最小值 最大 的那一列(有个前提, K K K 还能进行下一轮操作)

  • 考虑后手 K K K :同上理,最优策略会移动到 同行上最大值 最小 的那一行(有个前提, R R R 还能进行下一轮操作)

  • 若不是随时结束

    • k k k 为奇数时,最后操作的是 R R R,答案便是 同行上最大值 最小 那一行的最大值
    • k k k 为偶数时,最后操作的是 K K K,答案便是 同列上最小值 最大 那一列的最小值
  • 现考虑随时结束:先手已知不结束的最优值,只需和最初值比较一下,输出大的即可

#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int N=1e5+5;
int mx[N], mn[N];
signed main()
{
    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    int T;
    cin>>T;
    while(T--)
    {
        int n,m,k;
        cin>>n>>m>>k;
        int a[n+5][m+5];
        for(int i=1;i<=n;i++)
        {
            mx[i]=0;
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
                mx[i] = max(mx[i], a[i][j]); // 同行最大值
            }
        }
        if(k==1) { cout<<mx[1]<<endl; continue; } // 1要特判
        for(int i=1;i<=m;i++) mn[i] = 1e10;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                mn[j] = min(mn[j], a[i][j]); // 同列最小值
            }
        }
        int mnx=1e10, mxy=0;
        for(int i=1;i<=n;i++) mnx = min(mnx,mx[i]); // 取同行最大值的最小 
        for(int i=1;i<=m;i++) mxy = max(mxy,mn[i]); // 取同列最小值的最大
        if(k%2==0) cout<<max(mxy,a[1][1])<<endl;
        else cout<<max(mnx, a[1][1])<<endl;
    }

    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yezzz.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值