UVa 1606 - Amphiphilic Carbon Molecules
链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4481
题意:
平面上有n(n≤1000)个点,每个点为白点或者黑点。现在需放置一条隔板,
使得隔板一侧的白点数加上另一侧的黑点数总数最大。隔板上的点可以看作是在任意一侧。
分析:
扫描法
不妨假设隔板一定经过至少两个点(否则可以移动隔板使其经过两个点,并且总数不会变小),
可以先枚举一个基准点,然后将一条直线绕这个点旋转。每当直线扫过一个点,就可以动态修改两侧的点数。
注意本题存在多点共线的情况,如果用反三角函数计算极角,然后判断极角是否相同的话,很容易产生精度误差。
应该把极角相等的条件进行化简,只使用整数运算进行判断。
代码:
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std; const int UP = + ; struct DOT {
int x, y;
double rad;
bool operator < (const DOT& that) const {
return rad < that.rad;
}
} dot[UP]; int n, X[UP], Y[UP], C[UP]; inline bool left(DOT& a, DOT& b){ //判断点a是否在参考原点b的左侧
return a.y * b.x >= a.x * b.y;
} int solve(){
if(n < ) return n;
int ans = ;
for(int i = ; i < n; i++){ //枚举原点
int k = ;
for(int t = ; t < n; t++){
if(t == i) continue;
dot[k].x = X[t] - X[i]; //将点i视为原点,对其他点的坐标进行转换
dot[k].y = Y[t] - Y[i];
if(C[t]){ //如果点t是黑点,那么将其变为相对于原点对称的白点,这样结果不变
dot[k].x = -dot[k].x;
dot[k].y = -dot[k].y;
}
dot[k].rad = atan2(dot[k].y, dot[k].x); //求出O-dot[k]与正x轴的夹角的弧度值
k++;
}
sort(dot, dot + k);
int R = , sum = ; //一开始分隔线上有两个点
for(int L = ; L < k; L++){ //枚举分隔线的另一个点,即以O-dot[L]为分隔线
if(R == L){ //为了不与下面的 R != L 发生冲突,将R点左移一位
R = (R + ) % k;
sum++; //一开始也可抵消下面的 sum-- 的效果
}
while(R != L && left(dot[R], dot[L])){ //维护在分隔线左侧的点的个数
R = (R + ) % k;
sum++;
}
sum--; //因为上一次分隔线的左移,上一个dot[L]变成了现在分隔线右侧的点,故总点数减1
ans = max(ans, sum);
}
}
return ans;
} int main(){
while(scanf("%d", &n) && n){
for(int i = ; i < n; i++) scanf("%d%d%d", &X[i], &Y[i], &C[i]);
printf("%d\n", solve());
}
return ;
}
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 ...
- 【极角排序、扫描线】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 (扫描法+极角排序)
题意:平面上有 n 个点,每个点不是黑的就是白的,现在要放一个隔板,把它们分成两部分,使得一侧的白点数加上另一侧的黑点数最多. 析:这个题很容易想到的就是暴力,不妨假设隔板至少经过两个点,即使不经过也 ...
- UVA - 1606 Amphiphilic Carbon Molecules 极角扫描法
题目:点击查看题目 思路:这道题的解决思路是极角扫描法.极角扫描法的思想主要是先选择一个点作为基准点,然后求出各点对于该点的相对坐标,同时求出该坐标系下的极角,按照极角对点进行排序.然后选取点与基准点 ...
- UVA - 1606 Amphiphilic Carbon Molecules (计算几何,扫描法)
平面上给你一些具有黑或白颜色的点,让你设置一个隔板,使得隔板一侧的黑点加上另一侧的白点数最多.隔板上的点可视作任意一侧. 易知一定存在一个隔板穿过两个点且最优,因此可以先固定以一个点为原点,将其他点中 ...
- 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(计算几何)
题目 题目 分析 跟着lrj学的,理解了,然而不是很熟,还是发上来供以后复习 代码 #include <bits/stdc++.h> using namespace std; ; stru ...
- UVa 1606 (极角排序) Amphiphilic Carbon Molecules
如果,没有紫书上的翻译的话,我觉得我可能读不懂这道题.=_=|| 题意: 平面上有n个点,不是白点就是黑点.现在要放一条直线,使得直线一侧的白点与另一侧的黑点加起来数目最多.直线上的点可以看作位于直线 ...
随机推荐
- PIE SDK微分锐化
1.算法功能简介 微分锐化通过微分使图像的边缘或轮廓突出.清晰.导数算子具有突出灰度变化的作用,对图像运用导数算子,灰度变化较大的点处算得的值较高,因此我们将图像的导数算子运算值作为相应的边界强度,所 ...
- CentOS6 克 隆
原始机子关机 自己设置名字 保存地址 开机 配置hosts 后面的为你要设置的名字不配置可能xshell链接上不了网 更改名字: 配置网卡 删除物理地址 mac 和 uuid 删除网卡 重启
- GreenPlum 大数据平台--非并行备份(六)
一,非并行备份(pg_dump) 1) GP依然支持常规的PostgreSQL备份命令pg_dump和pg_dumpall 2) 备份将在Master主机上创建一个包含所有Segment数据的大的备份 ...
- URL篇之不安全字符处理
URL是可移植的.它要统一命名因特网上的所有资源,就需要通过各种不同的协议来传送这些资源.这些协议在传输数据时会使用不同的机制,所以,设计URL,使其可以通过任意因特网协议安全地传输是很重要的. UR ...
- 使用 Ninject
在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事情,续这篇文章之后,本文将用一个实际的示例来 ...
- (转)Python格式化字符 %s %d %f
Python格式化字符 %s %d %f 原文:http://blog.csdn.net/huangfu77/article/details/54807835 格式 描述%% 百分号标记 #就是输出一 ...
- Java实现Ip代理池
设置Ip代理很多时候都会有用到,尤其是在写爬虫相关项目的时候.虽然自己目前没有接触这种需求,但由于最近比较闲,就写着当作练习吧 爬取代理IP 爬取 关于爬取代理IP,国内首先想到的网站当然是 西刺代理 ...
- Supper关键字
java中的super关键字是一个引用变量,用于引用直接父类对象. 每当创建子类的实例时,父类的实例被隐式创建,由super关键字引用变量引用. java super关键字的用法如下: super可以 ...
- Linux进程优先级和nice值
在学习了linux的完全公平调度算法(CFS)后,记录下学习轨迹 这篇文章主要讲述,完全公平调度算法的工作方式,和一些调度知识 我们可以通过ps -l看到当前正在运行的进程的详细信息其中 F:表示进程 ...
- CRM——起步
一.CRM简介 crm 客户关系管理软件 ( Customer Relationship Management ). 二.CRM起步 1.设计表结构和数据库迁移 from django.db impo ...