题目翻译

A 和 B 两个人,在 $n \times m$ 的教室找位置。A 想和 B 坐得近,B 想和 A 坐得远,由 A 先选位置,请问对于所有情况,A 与 B 之间的距离各是多少?

补充:距离的定义为:$a_{i_1,j_1}$ 与 $a_{i_2,j_2}$ 距离为 $\left|i_1-i_2\right|+\left|j_1-j_2\right|$

题目思路

A 会选什么位置,我们不用考虑,因为题目求所有情况,不是最优或最坏,所以只需考虑 B 坐的位置。由于想离得远,那么不管 A 坐哪,B 一定选择四个角上离得最远的位置。

根据上述分析,我们只需穷举 A 坐的位置,并且每次判断 A 的位置与四个角的距离,就可以得出所有结果。

AC代码

int juli(int x1,int y1,int x2,int y2)//求距离函数
{
    return abs(x1-x2)+abs(y1-y2);
}
void solve()
{
    multiset<int>s;//答案要求排序,set自动排序+去重,mutiset自动排序+不去重
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)//双重循环穷举答案
        {
            s.insert(max({juli(i,j,1,1),juli(i,j,1,m),juli(i,j,n,1),juli(i,j,n,m)}));//判断四个角的最大距离
        }
    }
    for(auto i:s)cout<<i<<" ";//输出答案
    cout<<endl;
}

多组数据,代码未全。请勿copy,当心踩坑!

完整代码在这

科普一个热知识:

可能有些同学对于 s.insert(max({juli(i,j,1,1),juli(i,j,1,m),juli(i,j,n,1),juli(i,j,n,m)})); 这一行有疑惑,本机运行可能报错。其实这是新语法,之前求多个最大值要写很多 max(),现在只需 max({}),在大括号里写上多个值,如这样:

求 $a,b,c,d$ 的最大值

正常代码 cout<<max(max(a,b),max(c,d))<<endl; 要写 $3$ 个 max(),现在只需 cout<<max({a,b,c,d})<<endl; 即可。

最后修改:2023 年 04 月 22 日
v我50吃疯狂星期四