Codeforces Round #766 (Div. 2) B. Not Sitting

题目大意:

拉胡尔和蒂娜期待着在大学开始新的一年。当他们进入新教室时,他们观察到学生的座位排列成一个 n×m 的网格。 r 行 c 列的座位用 (r,c) 表示,两个座位 (a,b) 和 (c,d) 之间的距离为 |a−c|+|b−d|。

作为班长,蒂娜可以使用恰好 k 桶粉红色油漆。发生以下过​​程。

首先,蒂娜选择了教室里的 k 个座位,用粉色颜料作画。一桶油漆可以油漆一个座位。
在 Tina 在上一步中绘制了 k 个座位后,Rahul 选择了他坐的位置。由于讨厌粉红色,他不会选择涂成粉红色的座位。
拉胡尔选好座位后,蒂娜自己选了一个座位。除了 Rahul 选择的座位之外,她可以选择任何座位,无论是否涂漆。
拉胡尔想选择一个尽可能靠近蒂娜的座位。然而,蒂娜希望尽可能远离拉胡尔,因为我们无法将一些复杂的关系历史纳入声明中!

现在,Rahul 想知道 k=0,1,…,n⋅m−1,如果 Tina 有 k 桶油漆,如果 Rahul 和 Tina 都知道彼此的意图并且他们都选择了,那么 Rahul 可以离 Tina 多近尽可能战略性地选座?请帮助满足拉胡尔的好奇心!

输入
输入由多个测试用例组成。第一行包含一个整数 t (1≤t≤5⋅10^4)——测试用例的数量。测试用例的描述如下。

每个测试用例的第一行包含两个整数 n, m (2≤n⋅m≤10^5)——教室座位的行数和列数。

所有测试用例的 n⋅m 总和不超过 10^5
输出
对于每个测试用例,输出 n⋅m 有序整数 — 如果 Rahul 和 Tina 都为每个 k∈[0,n⋅m−1] 选择最佳座位,则他们之间的距离。

题解:

我们很容易的发现无论拉胡尔怎么坐,我们的蒂娜都会坐在四个顶点中离拉胡尔最远的位置,那么突然我们肯定会冒出一个想法,为什么我们不直接将每个位置对于四个顶点的最远位置算出来?于是,我们应当枚举这个地图中的每一点距离四个顶点的最大值将其求出来,然后放入数组中进行排序,为什么要排序呢,因为要涂色的时候肯定是距离短的先涂。所以我们可以得到代码如下:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,m;
		scanf("%d%d",&n,&m);
		int a[100005];
		int h,l;
		h=1;
		l=1;
		for(int i=1;i<=n*m;i++){
			if(l==m+1)
			h++,l=1;
			a[i]=max(max(abs(1-h)+abs(1-l),abs(1-h)+abs(m-l)),max(abs(n-h)+abs(1-l),abs(n-h)+abs(m-l)));
			l++;
		}
		sort(a+1,a+n*m);
		for(int i=1;i<=n*m;i++)
		printf("%d ",a[i]);
		printf("\n");
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值