为什么要比较以下解决方案的线斜率?
Why are slopes of lines compared for the below solution?
下面是解决方案,https://www.hackerrank.com/challenges/stars
for (int iStar1 = 0; iStar1 < n; iStar1++)
{
for (int iStar2 = iStar1 + 1; iStar2 < n; iStar2++)
{
int sum1 = 0;
for (int iStar3 = 0; iStar3 < n; iStar3++)
{
long line1 = (long)(stars[iStar3].y - stars[iStar1].y) * (stars[iStar2].x - stars[iStar1].x);
long line2 = (long)(stars[iStar3].x - stars[iStar1].x) * (stars[iStar2].y - stars[iStar1].y);
if ((iStar3 != iStar1) && (iStar3 != iStar2) && (line1 < line2))
{
sum1 += stars[iStar3].v;
}
}
int sum2 = sum1 + stars[iStar1].v + stars[iStar2].v;
if (sum1 > totalV - sum1)
{
sum1 = totalV - sum1;
}
if (sum2 > totalV - sum2)
{
sum2 = totalV - sum2;
}
if (sum1 > bestSum)
{
bestSum = sum1;
}
if (sum2 > bestSum)
{
bestSum = sum2;
}
}
}
为什么现有点形成的线的斜率与得到的分割线相比是?
如果你考虑推动最佳分隔线,你总是能够推动它直到它碰到一个点,然后旋转它直到它碰到另一个点。
这条调整线的分数将与原来的分数相同,所以你只需要考虑经过两个原始点的调整线。
这样做的原因是因为这大大减少了必须考虑的可能分隔线的数量。
下面是解决方案,https://www.hackerrank.com/challenges/stars
for (int iStar1 = 0; iStar1 < n; iStar1++)
{
for (int iStar2 = iStar1 + 1; iStar2 < n; iStar2++)
{
int sum1 = 0;
for (int iStar3 = 0; iStar3 < n; iStar3++)
{
long line1 = (long)(stars[iStar3].y - stars[iStar1].y) * (stars[iStar2].x - stars[iStar1].x);
long line2 = (long)(stars[iStar3].x - stars[iStar1].x) * (stars[iStar2].y - stars[iStar1].y);
if ((iStar3 != iStar1) && (iStar3 != iStar2) && (line1 < line2))
{
sum1 += stars[iStar3].v;
}
}
int sum2 = sum1 + stars[iStar1].v + stars[iStar2].v;
if (sum1 > totalV - sum1)
{
sum1 = totalV - sum1;
}
if (sum2 > totalV - sum2)
{
sum2 = totalV - sum2;
}
if (sum1 > bestSum)
{
bestSum = sum1;
}
if (sum2 > bestSum)
{
bestSum = sum2;
}
}
}
为什么现有点形成的线的斜率与得到的分割线相比是?
如果你考虑推动最佳分隔线,你总是能够推动它直到它碰到一个点,然后旋转它直到它碰到另一个点。
这条调整线的分数将与原来的分数相同,所以你只需要考虑经过两个原始点的调整线。
这样做的原因是因为这大大减少了必须考虑的可能分隔线的数量。