没得坐!
题意:
关于舔狗拉胡尔想坐到蒂娜身边但蒂娜嫌弃得不行的那些事,舔狗好去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