https://vjudge.net/problem/UVA-1606

题意:平面上有n个点,每个点为白点或者黑点。现在需放置一条隔板,使得隔板一侧的白点数加上另一侧的黑点数总数最大。隔板上的点可以看做是在任意一侧。

思路:每次可以选取两个点作为隔板,所以我们可以先枚举一个基准点,然后算出其他点关于基准点的相对坐标和关于坐标系的极角(可以用atan2函数来计算,返回与x坐标值的角度),剩下的点依次与基准点形成分隔线,然后将一条直线绕基准点旋转,每当直线扫过一个点,就可以动态修改两侧的点数。

本题还有一个优化的方法,那就是如果该点是黑点,就可以将它的坐标关于基准点旋转180°,这样扫描时就只需要计算一侧的白点数了。

动态维护的情况如下:

首先,红色的为分割线,扫描线从红线开始逆时针扫描,当扫描线逆时针旋转至黄线时,由于旋转角度已大于180°,所以点数为3个。此时需要移动分隔线,即分隔线变为了蓝线,由于分隔线改变,原来的1号点到了分隔线的右边,此时总的点数需要减去1。此时扫描线与分隔线小于180°,所以扫描线还可以继续逆时针旋转直到y负轴,由于经过了2,3两点,总的点数需要加上2。此时总点数为4。之后分隔线继续旋转,重复上述步骤,直到所有分隔线都模拟完毕。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std; const int maxn = +; int n;
int ans; struct node
{
int x, y;
int color;
double rad;
bool operator < (const node&rhs) const
{
return rad < rhs.rad;
}
}op[maxn],p[maxn]; bool left(node a, node b)
{
return a.x*b.y - a.y*b.x >= ;
} void solve()
{
if (n <= ) { ans = n; return; }
ans = ;
for (int i = ; i < n; i++) //枚举选择基点,一共有n个基点可以选择
{
int k = ;
for (int j = ; j < n; j++) //计算出各个点关于基点的相对坐标
{
if (i == j) continue;
p[k].x = op[j].x - op[i].x;
p[k].y = op[j].y - op[i].y;
if (op[j].color) //如果为黑点,则可以将它旋转180之后变为白点来计数
{
p[k].x = -p[k].x; p[k].y = -p[k].y;
}
p[k].rad = atan2(p[k].y, p[k].x); //求极角,返回角度值
k++;
}
sort(p, p + k);
//基准点-p[L]为分割线,基准点-p[R]为扫描线
int L = , R = , cnt = ; //初始点数设为2,即分隔线上的两个点
while (L < k) //每个点都尝试与基点成为分割线
{
if (R == L) { R = (R + ) % k; cnt++; } //空区域,数量+1,后面还会减去的
while (R != L && left(p[L], p[R])) //R不等于L并且在180度之内
{
R = (R + ) % k;
cnt++;
}
cnt--; //分隔线旋转,原本在分隔线上的点到了右边,所以要减去
L++; //分隔线旋转
ans = max(ans, cnt);
}
}
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (cin >> n && n)
{
for (int i = ; i < n; i++)
cin >> op[i].x >> op[i].y >> op[i].color;
solve();
cout << ans << endl;
}
return ;
}

UVa 1606 两亲性分子的更多相关文章

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

    Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new class of ...

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

    任意线可以贪心移动到两点上.直接枚举O(n^3),会TLE. 所以采取扫描法,选基准点,然后根据极角或者两两做叉积比较进行排排序,然后扫一遍就好了.旋转的时候在O(1)时间推出下一种情况,总复杂度为O ...

  3. UVA - 1606 Amphiphilic Carbon Molecules(两亲性分子)(扫描法)

    题意:平面上有n(n <= 1000)个点,每个点为白点或者黑点.现在需放置一条隔板,使得隔板一侧的白点数加上另一侧的黑点数总数最大.隔板上的点可以看做是在任意一侧. 分析:枚举每个基准点i,将 ...

  4. UVa 1606 - Amphiphilic Carbon Molecules

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

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

    Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new classof ...

  6. UVa 1606 (极角排序) Amphiphilic Carbon Molecules

    如果,没有紫书上的翻译的话,我觉得我可能读不懂这道题.=_=|| 题意: 平面上有n个点,不是白点就是黑点.现在要放一条直线,使得直线一侧的白点与另一侧的黑点加起来数目最多.直线上的点可以看作位于直线 ...

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

    题意:平面上有 n 个点,每个点不是黑的就是白的,现在要放一个隔板,把它们分成两部分,使得一侧的白点数加上另一侧的黑点数最多. 析:这个题很容易想到的就是暴力,不妨假设隔板至少经过两个点,即使不经过也 ...

  8. UVA - 1606 Amphiphilic Carbon Molecules 极角扫描法

    题目:点击查看题目 思路:这道题的解决思路是极角扫描法.极角扫描法的思想主要是先选择一个点作为基准点,然后求出各点对于该点的相对坐标,同时求出该坐标系下的极角,按照极角对点进行排序.然后选取点与基准点 ...

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

    平面上给你一些具有黑或白颜色的点,让你设置一个隔板,使得隔板一侧的黑点加上另一侧的白点数最多.隔板上的点可视作任意一侧. 易知一定存在一个隔板穿过两个点且最优,因此可以先固定以一个点为原点,将其他点中 ...

随机推荐

  1. 【深入理解javascript】闭包

    1.作用域 “javascript没有块级作用域”.所谓“块”,就是大括号“{}”中间的语句.例如if语句: 再比如for语句: 所以,我们在编写代码的时候,不要在“块”里面声明变量,要在代码的一开始 ...

  2. springboot中的日志配置

    日志方式:每天日志存放在一个文件中,info和warn日志存放一个文件,error存放一个文件 创建文件 logback-spring.xml <?xml version="1.0&q ...

  3. error.jsp错误页面跳转,统一异常处理

    常见web项目中会用倒计时然后跳转页面来处理异常 error.jsp关键代码: <script language="javascript" type="text/j ...

  4. 主成分分析 PCA算法原理

    对同一个体进行多项观察时,必定涉及多个随机变量X1,X2,…,Xp,它们都是的相关性, 一时难以综合.这时就需要借助主成分分析 (principal component analysis)来概括诸多信 ...

  5. DirectShow SDK下载

    http://blog.csdn.net/zx3517288/article/details/50547243 Q : GRMSDK_EN_DVD.iso 5 67.3MBGRMSDKIAI_EN_D ...

  6. 017-linux正则表达式

    一.单字符表示:1.特定字符:某个具体的字符. '1' 'a' '\.'2.范围内单个字符:单个字符[] [0-9] [259] [a-z] [abc] [A-Z] [ABC] [a-zA-Z] [, ...

  7. tensorflow训练自己的数据集实现CNN图像分类1

    利用卷积神经网络训练图像数据分为以下几个步骤 读取图片文件 产生用于训练的批次 定义训练的模型(包括初始化参数,卷积.池化层等参数.网络) 训练 1 读取图片文件 def get_files(file ...

  8. 2017-2018-2 20165207 实验四《Android开发基础》实验报告

    2017-2018-2 20165207 实验四<Android开发基础>实验报告 检查点1 安装测试Android Studio: 安装Android Studio 安装过程比较艰难,一 ...

  9. excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法

    excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法 office2007应该遇到“向程序发送命令时出现 问题”,设置为以管理员运行也不好用,重装office也不好用,下面介绍下 ...

  10. tomcat启动失败问题排除及解决办法 Server Tomcat v7.0 Server at localhost failed to start.

    tomcat启动失败问题排除及解决办法 Server Tomcat v7.0 Server at localhost failed to start. 导致上面问题的原因可能有很多种,每种的解决办法都 ...