UVa 1606 Amphiphilic Carbon Molecules 题解

难度:β

建议用时:40 min

实际用时:1 h

题目:??

代码:??

这题我看了刘汝佳大神的代码,在上面改了几个变量的名称,方便理解。

这是一道简单的几何题(不是真正的集合题,更可以说是一个坐标题),所以长话短说了。

题目告诉我们有一些随机分布的点,要我们用一个隔板把平面分开,然后往两边分别倒入水和丙酮来溶解掉这些点。

然而这些点有的只能溶解在水里,有的只能溶解到丙酮里。

任务是找到最大的溶解的点的数量。

这题建模就是按照刘汝佳大神的方法,一个隔板分开平面,要使左侧黑点数加右侧白点数的和最大。找到最大值。

具体的算法就不讨论了,书上有。

这里说一下大神的代码里的细节。

首先弄一个结构体,存点的相对坐标与相对角。

相对谁呢?相对枚举的原点。

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

以这个枚举的点为原点建立坐标系,表示每个点的坐标和与 x 轴正半轴的夹角。

for (int p = 0; p < n; p++) {
    if (p == pivot) continue;
    rlt_pos[tot].x = abs_pos[p].x - abs_pos[pivot].x;
    rlt_pos[tot].y = abs_pos[p].y - abs_pos[pivot].y;
    if (color[p] == 1) { rlt_pos[tot].x = -rlt_pos[tot].x; rlt_pos[tot].y = - rlt_pos[tot].y; }
    rlt_pos[tot].rad = atan2(rlt_pos[tot].y, rlt_pos[tot].x);
    tot++;
}

这里我把大神的代码里面的一些变量名称改了一下,便于我自己理解。

注意到大神有一个方便的做法。他把右侧的黑点当作左侧的白点,然后下面只统计左侧的点(不管颜色)有几个(而不是先统计左侧的白点又统计右侧的黑点)。这样统计时更快更便捷。

然后把每个点按相对夹角排序,这样可以保证一个一个扫描。

接下来就是重点了。扫描。

这个扫描的步骤我看了半天才明白。

其大致想法是:对每一个分割线,统计左边点的个数,然后让扫描到的点标号不变,改变分割点,继续从上次扫描的地方开始扫描,计数。

这样的好处是,不用每次改变分割线后重新从分割线开始扫描。前面的复杂度是 n^2,优化后是 n。

1 int L = 0, R = 0, cnt = 2; // 初始时记扫描点为 L,分割点为 R。
2 while (R < tot) {
3     if (L == R) { L = (L+1)%tot; cnt++; } // 如果扫描点与分割点重合,计数加一
4     while (L != R && left(rlt_pos[L], rlt_pos[R])) { L = (L+1)%tot; cnt++; } // 扫描
5     cnt--; // 减掉上次的分割点
6     R++; // 分割点改变
7     ans = max(ans, cnt);
8 }

这里比较难想的是第 3 行和第 5 行。

不难发现,第 3 行只在第一次扫描时执行。因为之后扫描点与分割点不可能重合了,这是因为我们要求扫描点必须要在分割点左边。

即使在某次扫描时扫描点刚好转到了分割点(然后退出第 4 行),然而分割点每次加 1,这样扫描点依然追不上分割点。

第 5 行。这里转完以后统计时要减 1,减的是上次的分割点。然而对于第一次扫描是不存在“上一个”分割点的,所以 cnt 的初始值设为 2。cnt 代表当前确定的点数。cnt = 1 是原点。

大神的代码让我看的花方。

2018-02-03

原文地址:https://www.cnblogs.com/Alrond/p/8409883.html

时间: 2024-10-12 21:49:25

UVa 1606 Amphiphilic Carbon Molecules 题解的相关文章

uva 1606 amphiphilic carbon molecules【把缩写写出来,有惊喜】(滑动窗口)——yhx

Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new classof nanoparticles called Amphiphilic Carbon Molecules (ACMs). ACMs are semiconductors. It meansthat they can be either conductors or insulators of electro

【极角排序、扫描线】UVa 1606 - Amphiphilic Carbon Molecules(两亲性分子)

Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new class of nanoparticles called Amphiphilic Carbon Molecules (ACMs). ACMs are semiconductors. It means that they can be either conductors or insulators of elect

UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)

任意线可以贪心移动到两点上.直接枚举O(n^3),会TLE. 所以采取扫描法,选基准点,然后根据极角或者两两做叉积比较进行排排序,然后扫一遍就好了.旋转的时候在O(1)时间推出下一种情况,总复杂度为O(n^2logN)就可以过了. 另外,本题有个很巧妙的技巧,就是一点等效与相反坐标的相反颜色的点. 第一次写,细节还是蛮多的,花了好久才搞清所有细节... 极角排序版,比较容易理解,932ms. #include<bits/stdc++.h> using namespace std; const

UVa 1606 Amphiphilic Carbon Molecules (扫描法+极角排序)

题意:平面上有 n 个点,每个点不是黑的就是白的,现在要放一个隔板,把它们分成两部分,使得一侧的白点数加上另一侧的黑点数最多. 析:这个题很容易想到的就是暴力,不妨假设隔板至少经过两个点,即使不经过也可以通过平移使它经过,然后每次枚举两个点,当作隔板,枚举量是n*n, 然后计算是 n,那么时间复杂度就是 n3 ,一定会超时的,我产可以这样想,先枚举一个点,然后绕这个点旋转,每扫过一个点,就动态修改两侧的点数, 在转一周过程中,每个点至多扫到两次,这个过程复杂是 n,扫描前进行极角,时间复杂度是

UVA - 1606 Amphiphilic Carbon Molecules 极角扫描法

题目:点击查看题目 思路:这道题的解决思路是极角扫描法.极角扫描法的思想主要是先选择一个点作为基准点,然后求出各点对于该点的相对坐标,同时求出该坐标系下的极角,按照极角对点进行排序.然后选取点与基准点形成的线对点进行扫描,基准线为遍历选取,扫描线扫过的点,减去基准线扫过的点即为所要求的点的数量.同时注意到我们要求的是线两边的两种点的数量,于是一种点比如黑点可以旋转180度,然后之考察这180度内的百点数量即可.本题的基准点选取复杂度为O(n),极角排序复杂度O(nlogn),扫描复杂度O(n),

UVA - 1606 Amphiphilic Carbon Molecules (计算几何,扫描法)

平面上给你一些具有黑或白颜色的点,让你设置一个隔板,使得隔板一侧的黑点加上另一侧的白点数最多.隔板上的点可视作任意一侧. 易知一定存在一个隔板穿过两个点且最优,因此可以先固定以一个点为原点,将其他点中的黑点移到对称的位置,并将所有点按极角排序,然后双指针遍历其他点,利用尺取法维护一个角度不超过180°的区间(算角度是否大于180°可以用叉积).对每个点都算一遍,取最大区间长度即为最终答案. 区间尺取部分网上的代码基本都的lr表示法,比较冗长,我这里给出了lw表示法(w代表区间长度),代码简洁了许

【UVa】1606 Amphiphilic Carbon Molecules(计算几何)

题目 题目 分析 跟着lrj学的,理解了,然而不是很熟,还是发上来供以后复习 代码 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1005; 5 6 struct Point 7 { 8 int x,y; 9 double rad; 10 bool operator < (const Point &rhs) const{ 11 return rad<rhs.rad; 12 } 13

1606 - Amphiphilic Carbon Molecules(极角排序)

这道题的关键是用到了极角排序的方法,枚举一个固定点,其他点以此点为原心求出角度,然后排序,将数点的多少转化为数角度的多少.因为角度是有序的,便可以用一次扫描求出最大值.另外,还用到了一个小技巧,那就是利用对称性,将一侧的黑点转化成另一侧的白点,这样只需要数白点的个数就好了. 值得注意的是,为了形成那条分界线,我们枚举两个角度(也就是由基准点为原心的新坐标系中的点)   ,使他们之间的夹角不超过180°,为了使分界线旋转360°,我们将l变量枚举到最后一个点再停,所以r变量的自加变成了(r+1)%

Amphiphilic Carbon Molecules

Description: Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new class of nanoparticles called Amphiphilic Carbon Molecules (ACMs). ACMs are semiconductors. It means that they can be either conductors or insula