CF1627B题解

Not Sitting

题面翻译

Rahul 和 Tina 在玩一个游戏。游戏在一个 n×mn\times m 的网格图上进行,记第 rr 行第 cc 列上的格子为 (r,c)(r,c)。定义 (a,b)(a,b)(c,d)(c,d) 之间的距离为 ac+bd\left|a-c\right|+\left|b-d\right|

游戏开始后,Tina 会选择恰好 kk 个格子,并将其涂成粉红色。涂完以后,Rahul 会选择任意一个没有被涂成粉红色的格子并在那个格子上坐下。此后,Tina 也会选择任意一个格子(包括被涂成粉红色和没有被涂成粉红色的格子)并在那个格子上坐下。Rahul 希望他和 Tina 之间的距离尽可能近,而 Tina 希望她和 Rahul 之间的距离尽可能远。于是,对于所有的 k[0,n×m1]Nk\in[0,n\times m-1]\cap\mathbb N ^*,Rahul 都想知道他和 Tina 之间的距离是多少。

数据范围:

  • tt 组数据,1t5×1041\leqslant t\leqslant 5\times 10^4
  • 2n×m,(n×m)1052\leqslant n\times m,\sum(n\times m)\leqslant 10^5

样例 #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;
}
posted @   KK_SpongeBob  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示