UVa 1606 两亲性分子
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 两亲性分子的更多相关文章
- 【极角排序、扫描线】UVa 1606 - Amphiphilic Carbon Molecules(两亲性分子)
Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new class of ...
- UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)
任意线可以贪心移动到两点上.直接枚举O(n^3),会TLE. 所以采取扫描法,选基准点,然后根据极角或者两两做叉积比较进行排排序,然后扫一遍就好了.旋转的时候在O(1)时间推出下一种情况,总复杂度为O ...
- UVA - 1606 Amphiphilic Carbon Molecules(两亲性分子)(扫描法)
题意:平面上有n(n <= 1000)个点,每个点为白点或者黑点.现在需放置一条隔板,使得隔板一侧的白点数加上另一侧的黑点数总数最大.隔板上的点可以看做是在任意一侧. 分析:枚举每个基准点i,将 ...
- UVa 1606 - Amphiphilic Carbon Molecules
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- uva 1606 amphiphilic carbon molecules【把缩写写出来,有惊喜】(滑动窗口)——yhx
Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new classof ...
- UVa 1606 (极角排序) Amphiphilic Carbon Molecules
如果,没有紫书上的翻译的话,我觉得我可能读不懂这道题.=_=|| 题意: 平面上有n个点,不是白点就是黑点.现在要放一条直线,使得直线一侧的白点与另一侧的黑点加起来数目最多.直线上的点可以看作位于直线 ...
- UVa 1606 Amphiphilic Carbon Molecules (扫描法+极角排序)
题意:平面上有 n 个点,每个点不是黑的就是白的,现在要放一个隔板,把它们分成两部分,使得一侧的白点数加上另一侧的黑点数最多. 析:这个题很容易想到的就是暴力,不妨假设隔板至少经过两个点,即使不经过也 ...
- UVA - 1606 Amphiphilic Carbon Molecules 极角扫描法
题目:点击查看题目 思路:这道题的解决思路是极角扫描法.极角扫描法的思想主要是先选择一个点作为基准点,然后求出各点对于该点的相对坐标,同时求出该坐标系下的极角,按照极角对点进行排序.然后选取点与基准点 ...
- UVA - 1606 Amphiphilic Carbon Molecules (计算几何,扫描法)
平面上给你一些具有黑或白颜色的点,让你设置一个隔板,使得隔板一侧的黑点加上另一侧的白点数最多.隔板上的点可视作任意一侧. 易知一定存在一个隔板穿过两个点且最优,因此可以先固定以一个点为原点,将其他点中 ...
随机推荐
- HandlerSocket
HandlerSocket http://www.uml.org.cn/sjjm/201211093.asp 目录: HandlerSocket的原理 HandlerSocket的优势和缺陷阐述 Ha ...
- 小P的故事——神奇的换零钱&&人活着系列之平方数
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2777&cid=1219 这题不会,看了别人的代码 #include <iostre ...
- python 皮尔森相关系数
皮尔森理解 皮尔森相关系数(Pearson correlation coefficient)也称皮尔森积矩相关系数(Pearson product-moment correlation coeffic ...
- 关闭WPS启动时显示的在线模板
关闭WPS启动时显示的在线模板 以WPS2016为例,如下图: 操作步骤如下: ①点击在线模板页面右下方的"设置"选项 ②"设置"界面打开后,选择启动WPS默认 ...
- c++移动构造函数
写在前面 C++中有“左值”.“右值”的概念,C++11以后,又有了“左值”.“纯右值”.“将亡值”的概念.关于这些概念,许多资料上都有介绍,本文在拾人牙慧的基础上又加入了一些自己的一些理解,同时提出 ...
- Leetcode: Construct Binary Tree from Preorder and Inorder Transversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that ...
- Linux系统——MySQL基础(二)
# MySQL数据库完全备份与恢复## 数据库备份的分类1. 从物理与逻辑的角度,备份可以分为物理备份和逻辑备份.(1)物理备份:对数据库操作系统的物理文件(数据文件.日志文件)的备份.物理备份又可分 ...
- cocos代码研究(5)Action学习笔记
理论部分 Action类也是cocos核心基础类之一,在游戏中起着非常重要的作用,继承自Ref,被 FiniteTimeAction(有限时间动作), Follow , 以及 Speed 继承. 有限 ...
- 更换mysql数据库的datadir目录
更换过程如下: 1.新建指定的datadir目录,这里举例如:E:/mysql_datadir/data. 2.关闭mysql57服务器. 3.将原来的datadir目录下面的所有文件拷贝到E:/my ...
- UVM中Callback机制
Callback机制,其实是使用OOP来实现的一种程序开发者向程序使用者提供的模块内部的接口.可以在Test_case的高度改变其他component的一些行为. Systemverilog中已经提供 ...