傻逼模拟已经花了我半个小时了。
感觉思路和第二篇题解如出一辙,但就是卡在最后两个 Subtask。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf = 0x3f3f3f3f;
struct node{
int x,y;
}s[55];
int manhatten(node a,node b){
return abs(a.x - b.x) + abs(b.y - a.y);
}
signed main(){
int n,k;
cin >> n >> k;
for (int i=1;i<=n;i++){
cin >> s[i].x >> s[i].y;
}
if (n == k){
cout << 0;
return 0;
}
switch (k){
case 1:{
int ans = inf;
for (int i=1;i<=n;i++){
int maxdis = -inf;
for (int j=1;j<=n;j++){
if (j == i)continue;
int dis = manhatten(s[i],s[j]);
maxdis = max(maxdis,dis);
}
ans = min(ans,maxdis);
}
cout << ans;
break;
}
case 2:{
int ans = inf;
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
int maxdis = -inf;
if (i == j)continue;
for (int k=1;k<=n;k++){
if (k == i || k == j)continue;
int dis = min(manhatten(s[i],s[k]),manhatten(s[j],s[k]));
maxdis = max(maxdis,dis);
}
ans = min(maxdis,ans);
}
}
cout << ans;
break;
}
default:{
int ans = inf;
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
if (i == j)continue;
int maxdis = -inf;
for (int k=1;k<=n;k++){
if (k == i || k == j)continue;
for (int l=1;l<=n;l++){
if (l == i || l == j || l == k)continue;
int dis = min(manhatten(s[i],s[l]),min(manhatten(s[j],s[l]),manhatten(s[k],s[l])));
maxdis = max(maxdis,dis);
}
}
ans = min(maxdis,ans);
}
}
cout << ans;
break;
}
}
return 0;
}