我一直在尝试this问题,但没有成功。
问题是“给定平面中的一组源点,找到一个点(具有整数坐标),以便最小化到任何源点的最大曼哈顿距离”。
我在Google Code Jam上找到very similar problem,我使用他们的竞赛分析成功解决了这个问题。
我的方法与Code Jam问题的解决方案非常相似,适用于CodeForces问题中的整数约束。
据我从错误的测试用例的细节中可以看出,我的答案“不够好”,即存在一个较小的最大距离点。
不幸的是,我无法链接我的代码(2个链接限制),所以我在下面复制粘贴。
#include <iostream>
#include <iomanip>
#include <cmath>
#define setMax(a, b) (a<b)?(a=b):0
#define setMin(a, b) (a>b)?(a=b):0
using namespace std;
const int N = (int)1e5;
const long long LL_UP = (long long)9e18;
struct point
{
long long x, y, z;
}s[N];
bool doesAnswerExist(long long c, int n, point &ans)
{
long long A, B, C, D, E, F, G, H;
A = C = E = G = -LL_UP;
B = D = F = H = LL_UP;
for (int i = 0; i < n; ++i)
{
setMax(A, s[i].x + s[i].y + s[i].z - c);
setMin(B, s[i].x + s[i].y + s[i].z + c);
setMax(C, -s[i].x + s[i].y + s[i].z - c);
setMin(D, -s[i].x + s[i].y + s[i].z + c);
setMax(E, s[i].x - s[i].y + s[i].z - c);
setMin(F, s[i].x - s[i].y + s[i].z + c);
setMax(G, s[i].x + s[i].y - s[i].z - c);
setMin(H, s[i].x + s[i].y - s[i].z + c);
}
if (A > B or C > D or E > F or G > H)
return false;
long long xMin = ceil(max((G+E)/2.0, (A-D)/2.0)), xMax = floor(min((B-C)/2.0, (H+F)/2.0));
if (xMin > xMax)
return false;
for (ans.x = xMin; ans.x <= xMax; ++ans.x)
{
long long ypz = max(A-ans.x, C+ans.x), ymz = max(ans.x-F, G-ans.x);
if ((long long)fabs(ymz + ypz) % 2 == 1)
{
if (ypz < min(B-ans.x, D+ans.x))
++ypz;
else if (ymz < min(ans.x-E, H-ans.x))
++ymz;
else
continue;
}
ans.y = (ypz+ymz)/2;
ans.z = (ypz-ymz)/2;
return true;
}
return false;
}
void binSearch(long long l, long long r, int n, point &ans)
{
if (l == r)
{
doesAnswerExist(l, n, ans);
return;
}
long long mid = (l+r)/2;
if (doesAnswerExist(mid, n, ans))
binSearch(l, mid, n, ans);
else
binSearch(mid+1, r, n, ans);
}
int main()
{
ios_base::sync_with_stdio(false);
int t, n;
cin >> t;
while (t--)
{
cin >> n;
for (int i = 0; i < n; ++i)
cin >> s[i].x >> s[i].y >> s[i].z;
point ans;
binSearch(0, (long long)3e18, n, ans);
cout << ans.x << ' ' << ans.y << ' ' << ans.z << '\n';
}
return 0;
}
答案 0 :(得分:0)
我自己解决了这个问题,我必须说,这是我做过的最愚蠢的错误。
我愚蠢地假设将整数除以2将得到底数(x / 2),但正如我刚刚发现的那样,对于负数而言并非如此,因为int(-2.5)将给出-2和不是-3。