CF1627B题解
Not Sitting
题面翻译
Rahul 和 Tina 在玩一个游戏。游戏在一个 的网格图上进行,记第 行第 列上的格子为 。定义 与 之间的距离为 。
游戏开始后,Tina 会选择恰好 个格子,并将其涂成粉红色。涂完以后,Rahul 会选择任意一个没有被涂成粉红色的格子并在那个格子上坐下。此后,Tina 也会选择任意一个格子(包括被涂成粉红色和没有被涂成粉红色的格子)并在那个格子上坐下。Rahul 希望他和 Tina 之间的距离尽可能近,而 Tina 希望她和 Rahul 之间的距离尽可能远。于是,对于所有的 ,Rahul 都想知道他和 Tina 之间的距离是多少。
数据范围:
- 组数据,。
- 。
样例 #1
样例输入 #1
2
4 3
1 2
样例输出 #1
3 3 4 4 4 4 4 4 5 5 5 5
1 1
主要思路:模拟+贪心
Rahul 先选择位置,假设刚开始所有位置都未被涂色,那么 Rahul 一定会选择最靠近中间的某个位置;而 Tina 一定会选择四个墙角中离 Rahul 最远的一个位置。
对于每一个被涂色的格子,总是被涂色前 Rahul 的最佳选择,因为他们的选择都是明智的,也就是说我们可以将被涂色的格子作为 Rahul 的位置。
因为每个格子都会被涂色,所以每个格子都会作为 Rahul 的座位。
这样,问题就简化为了:求出每个位置距离四个角落的距离的最大值,然后将他们放到一个数组中,从小到大排序输出即可。
附源码:
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int res[N];
int n, m, cnt;
int main(){
int T;
cin>>T;
while(T--){
cnt=0;//多组不清空,提交两行泪
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){//教室是二维的,要双重循环
res[cnt++]=max(max(abs(1-i)+abs(1-j),abs(n-i)+abs(1-j)),max(abs(1-i)+abs(m-j),abs(n-i)+abs(m-j)));//求每个位置距离四个角落的距离的最大值
}
}
sort(res,res+cnt);//排序
for(int i=0;i<cnt;i++){
cout<<res[i]<<' ';//输出
}
cout<<endl;//多组数据换行
}
return 0;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575292

浙公网安备 33010602011771号