题意:Roundgod和kimoyami在玩一个棋盘游戏,棋盘大小为n*m,每个格子有a[i][j]的价值,最开始的位置在(1,1),Roundgod与kimoyami轮流走(Roundgod先走),Roundgod只能横着走(走任意格),kimoyami只能竖着走(走任意格),两人最多走的步数为k(也可以在到某人走时不走而选择终止游戏),Roundgod想要使最终到达的格子的值最大,kimoyami想要使最终到达的格子的值最小,如果两个玩家都选择了最佳策略,求游戏的最终价值。
分析:样例太水,自己随便造几组就会知道,当k为奇数时,最优解即最小的每行的最大值;当k为偶数时,最优解即最大的每列的最小值。另外,当k==1时,找第一行的最大值即可。最后注意可在任意时刻结束游戏,Roundgod已知走完k步的最优值,只需与a[1][1]比较(是否在第一步终止游戏),最后输出大的那个即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=1e9;
vector<vector<int>>v;//用数组存不下
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
ll k;
scanf("%d%d%lld",&n,&m,&k);
v.resize(n);//前n个元素清空
for(int i=0;i<n;i++)
{
v[i].resize(m);
for(int j=0;j<m;j++)
{
scanf("%d",&v[i][j]);
}
}
if(k==1)
{
int maxx=0;
for(int i=0;i<m;i++)
{
maxx=max(maxx,v[0][i]);
}
printf("%d\n",maxx);
}
else if(k%2==0)
{
int maxx=0;
for(int i=0;i<m;i++)
{
int minn=inf;
for(int j=0;j<n;j++)
{
minn=min(minn,v[j][i]);
}
maxx=max(maxx,minn);
}
printf("%d\n",max(maxx,v[0][0]));
}
else
{
int minn=inf;
for(int i=0;i<n;i++)
{
int maxx=0;
for(int j=0;j<m;j++)
{
maxx=max(maxx,v[i][j]);
}
minn=min(minn,maxx);
}
printf("%d\n",max(minn,v[0][0]));
}
}
}