题目翻译
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;
即可。