UVA1606 (Amphiphilic Carbon Molecules)(极角排序,扫描)

博客探讨了如何解决UVA1606问题,通过极角排序和扫描法寻找隔板位置,使得隔板两侧白点和黑点数量之和最大。文章分析了不同思路,包括枚举法的时间复杂度问题,使用极角排序优化,以及黑点对称变换的方法。同时,讨论了在极角排序中atan2函数和向量叉乘的优缺点,并提醒读者注意在l等于r时cnt的处理细节。
摘要由CSDN通过智能技术生成

UVA1606 (Amphiphilic Carbon Molecules)(极角排序,扫描法)

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

思路分析:
(1)、如果枚举两点,以两点所在的直线作为隔板,统计隔板两侧的点的分布,时间复杂度为O(n3),会超时。
(2)、通过枚举基准点,以基准点为坐标系原点,计算其余点的相对坐标,并按照极角排序。将基准点和除基准点的另外一个点的连线作为隔板,扫描整张图,动态维护点的数量。
(3)、可以将黑点以隔板为对称轴进行坐标的对称变换,这样,只需扫描隔板的一侧即可。
(4)、动态维护扫描到点的数量cnt,在基准线(隔板)变换时,只需cnt–
(5)、扫描法即为带有顺序的枚举法,在枚举时可以维护一些量,使得计算简化,避免进行重复的运算。
(6)、在进行极角排序时,有两种方法:
1、用atan2函数(在cmath头文件中)进行排序,传入纵坐标y为第一个参数,横坐标x为第二个参数,返回y/x的反正切,取值时(-pi,pi]从第三象限逆时针旋转成递增关系。
2、使用二维向量叉乘,有向量a(x1,y1),b(x2,y2),则a×b=x1y2-x2y1。如果a×b大于0,则从a边到b边(沿顺时针方向)的夹角小于pi;如果a×b等于0,则a与b共线;如果a×b小于0,则从a边为起始边到b边的夹角大于pi;
atan2的速度快,但精度不佳;
用向量叉乘速度慢,但精度可以。

#include<bits/stdc++.h>
using namespace std;
struct Node{
   
	int x,y,r;
	double k;
	bool operator <(const Node &p) const{
   
		return k<p.k;
	}
}; 
Node node[1005];
Node re_pos[1005]; //相对位置
int n;
bool is_left(Node a,Node b)//向量叉乘 a×b=a*b*sina 如果叉乘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值