Codeforces周赛 #766 (Div. 2):B. Not Sitting(思维、贪心、博弈)

没得坐!

在这里插入图片描述
题意:

关于舔狗拉胡尔想坐到蒂娜身边但蒂娜嫌弃得不行的那些事,舔狗好去4啊

  • 给定一张 n * m 的座位表,蒂娜最多能先划掉其中的 k(k < n * m) 个座位,然后拉胡尔选一个座位(没被划掉中的),蒂娜再选一个座位(任选);
  • 定义两人的距离为哈密顿距离,即横坐标差 + 纵坐标差;
  • 拉胡尔想尽可能舔到蒂娜,但蒂娜想尽可能远离拉胡尔,他们一样聪明,行动都是最优的(选座位和划座位);
  • 输出 n * m 个情况,蒂娜划掉 0个、1个、2个 … k个座位时,拉胡尔与蒂娜的最小距离

思路:

  • 何必随时想着猜着他们的最优决策,直接枚举拉胡尔能坐的 n * m 个位置,初始没划掉座位时,拉胡尔最优解肯定坐到最中间;

  • 贪心地想,蒂娜想远离拉胡尔,后手选位置肯定会选择四个角落,这四个位置和拉胡尔的位置能取到 max 距离的那个,就是蒂娜会选择的位置;

  • 当前距离确定了,下一步蒂娜就会填上拉胡尔的位置,阻止他最优地舔到自己;

  • 依次这样下去逐渐填满 k 个座位,如此就能得到结果。

代码:

#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
#define mem(a,b) memset(a,b,sizeof a)
#define cinios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define sca scanf
#define pri printf
#define ul (u << 1)
#define ur (u << 1 | 1)
#define fx first
#define fy second
//#pragma GCC optimize(2)
//[博客地址](https://blog.csdn.net/weixin_51797626?t=1) 
using namespace std;

typedef long long ll;
typedef pair<ll, int> PII;
typedef pair <ll, PII> PI;

const int N = 210, M = 500010, MM = N;
int INF = 0x3f3f3f3f, mod = 100003;
ll LNF = 0x3f3f3f3f3f3f3f3f;
int n, m, k, T, S, D;
char s[N][N];
int a[M];//存储最小距离

int main() {
	cinios;

	cin >> T;
	while (T--)
	{
		cin >> n >> m;
		k = 0;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++) {
				int t1 = max({ abs(1 - i) + abs(1 - j),abs(n - i) + abs(m - j) });
				int t2 = max(abs(n - i) + abs(1 - j), abs(1 - i) + abs(m - j));
				int mx = max(t1, t2);//枚举四个角和当前位置的距离
				a[k++] = mx;//放入数组中
			}
		sort(a, a + k);//最后直接从小到大排序
		for (int i = 0; i < k; i++)
			cout << a[i] << ' ';//越填座位拉胡尔和蒂娜的距离肯定越来越大
		cout << '\n';
	}

	return 0;
}
/*
*/

舔狗不得house

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值