UVa 1606 - Amphiphilic Carbon Molecules 题解

UVa1606 Amphiphilic Carbon Molecules

代码仓库

1606.cc

由于开始没有想法,所有直接看了刘汝佳老师的代码。等过几天把代码忘了,再尝试自己写一下吧(如果还想得起来)。

话不多说,直接看图。

1.首先我们先选择一个点作为中心点。

for (int i = 0; i < n; i++)

2.枚举这个点和其他点的连线,并把有颜色的点移到关于中心点对称的另一侧。

for (int j = 0; j < n; j++)
    if (j != i)
if (color[j])
{
    p[k].x = -p[k].x;
    p[k].y = -p[k].y;
}

3.利用方向角atan2()的返回值(-Pi~Pi)给每条线排序。

sort(p, p + k);

4.按刚才排好的顺序,选择一条线,计算从起始点开始逆时针旋转180度所扫描到的点的个数,并且在计算过程中保存最多个数的值。

int L = 0, R = 0, cnt = 2;
if (R == L)
{
    R = (R + 1) % k;
    cnt++;
}
while (R != L && Left(p[L], p[R]))//不超过180度
{
    R = (R + 1) % k;
    cnt++;
}
bool Left(Point A, Point B)
{
    return A.x * B.y - A.y * B.x >= 0;
}
ans = max(ans, cnt);


继续计算完所有线。

while (L < k)

5.这时我们就得到了以这个中心点和其他点所有连线的情况里,最大的一侧有白点和另一侧黑点的总数。我们继续第一步的操作,选择另外一个点作为新的中心点,直至所有点都当过中心点,那时我们就可以得到所有情况里,最大的一侧有白点和另一侧黑点的总数。

posted @ 2021-03-01 21:59  ithepug  阅读(94)  评论(0编辑  收藏  举报