题目链接:

id=2280">点击打开链接

题目大意:给出n个点的坐标。每一个点有一个值0或者1,如今有一个隔板(无限长)去分开着n个点,一側统计0的个数,一側统计1的个数,假设点在板上,那么都被统计到,问最多能够统计到多少个点。

对每一个点都做一次极角排序,然后依照排序后的点进行遍历板的位置。统计出在板上的点的个数。两側的0和1的个数。

然后求最大值。

可是极角排序的基准点仅仅能是最左下角的点,所以还要进行坐标转化,假设某一个点再当前基准点的下方。那么就能够转换坐标。改变那个点的坐标为与基准点对称的点,同一时候点的值改变。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std ;
#define eqs 1e-9
struct node{
double x , y ;
int k ;
}p[1100] , q , a[1100] ;
node sub(node a,node b) {
a.x -= b.x ;
a.y -= b.y ;
return a ;
}
double dis(node a,node b) {
double l1 = a.x*a.x+a.y*a.y ;
double l2 = b.x*b.x+b.y*b.y ;
if( l2-l1 >= eqs ) return 1 ;
else return 0 ;
}
int mul(node a,node b) {
double s = a.x*b.y - a.y*b.x ;
if( s >= eqs ) return 1 ;
else if( s <= -eqs ) return -1 ;
else return 0 ;
}
int cmp(node a,node b) {
a = sub(a,q) ; b = sub(b,q) ;
int k = mul(a,b) ;
if( k == 1 ) return 1 ;
else if( k == -1 ) return 0 ;
else {
return dis(a,b) ;
}
}
int main() {
int n , m , ans , sum0 , sum1 ;
int s , i , j , k ;
int cnt0 , cnt1 , num0 , num1 ;
while( scanf("%d", &n) && n ) {
for(i = 0 ; i < n ; i++) {
scanf("%lf %lf %d", &p[i].x, &p[i].y, &p[i].k) ;
}
q.x = q.y = 0 ;
ans = 0 ;
for(s = 0 ; s < n ; s++) {
sum0 = sum1 = 0 ;
for(i = m = 0 ; i < n ; i++) {
if( i == s ) continue ;
a[m].x = p[i].x - p[s].x ;
a[m].y = p[i].y - p[s].y ;
a[m].k = p[i].k ;
if( a[m].y < 0 || (a[m].y == 0 && a[m].x < 0) ) {
a[m].x = -a[m].x ;
a[m].y = -a[m].y ;
a[m].k = 1 - a[m].k ;
}
if( a[m].k ) sum1++ ;
else sum0++ ;
m++ ;
}
sort(a,a+m,cmp) ;
cnt0 = cnt1 = 0 ;
num0 = num1 = 0 ;
for(i = j = 0 ; i < m ; i++) {
if( a[i].k ) num1++ ;
else num0++ ;
while( mul( sub(a[j],q) , sub(a[i],q) ) ) {
if( a[j].k ) cnt1++ ;
else cnt0++ ;
j++ ;
}
ans = max(ans,max(sum0-num0+cnt1,sum1-num1+cnt0)+(num0-cnt0+num1-cnt1+1) ) ;
}
}
printf("%d\n", ans) ;
}
return 0 ;
}

poj2280--Amphiphilic Carbon Molecules(扫描线+极角排序+转换坐标)的更多相关文章

  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【把缩写写出来,有惊喜】(滑动窗口)——yhx

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

  3. POJ 2280 Amphiphilic Carbon Molecules 极角排序 + 扫描线

    从TLE的暴力枚举 到 13313MS的扫描线  再到 1297MS的简化后的扫描线,简直感觉要爽翻啦.然后满怀欣喜的去HDU交了一下,直接又回到了TLE.....泪流满面 虽说HDU的时限是2000 ...

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

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

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

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

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

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

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

    题目 题目 分析 跟着lrj学的,理解了,然而不是很熟,还是发上来供以后复习 代码 #include <bits/stdc++.h> using namespace std; ; stru ...

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

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

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

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

随机推荐

  1. Django REST Framework - 分页 - 渲染器 - 解析器

    为什么要使用分页? 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输过程中耗时也会 ...

  2. 【HDU 6299】Balanced Sequence

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 我们贪心地把每一个括号序列能匹配都按照栈的规则都匹配出来. (直接递增匹配对数*2就可以了 最后栈里面就只剩下类似))))((((( ...

  3. java源码之Comparable和Comparator

    1,Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”.  即然实现Comparable接口的类支持排序,假设现在存在“实 ...

  4. 【转载】Select函数实现原理分析

    Select函数实现原理分析 <原文> select需要驱动程序的支持,驱动程序实现fops内的poll函数.select通过每个设备文件对应的poll函数提供的信息判断当前是否有资源可用 ...

  5. BZOJ 2005 [Noi2010]能量採集 (容斥)

    [Noi2010]能量採集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 2324  Solved: 1387 [id=2005"> ...

  6. 同一个TextView设置不同的颜色和大小

    //strategy1是一个TextView SpannableStringBuilder builder1 = new SpannableStringBuilder(strategy1.getTex ...

  7. 基于redis ae实现 Linux中的文件系统监控机制(inotify)

    (英文部分为转的.代码是个人代码) 1 What's inotify  The inotify API provides a mechanism for monitoring file system ...

  8. codevs 3372 选学霸(hash+并查集+多重背包)

    先通过并查集处理出来有多少种不同的集合,每一个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候能够通过hash处理出来每一个数目同样的集合的个数. 这样以人数为权值.个数为限制进行 ...

  9. NOIP2017提高组模拟赛 8(总结)

    NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...

  10. [Swift]数组(Array)最强解析

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...