zoukankan      html  css  js  c++  java
  • poj2280--Amphiphilic Carbon Molecules(扫描线+极角排序+转换坐标)

    题目链接:点击打开链接

    题目大意:给出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
    ", ans) ;
        }
        return 0 ;
    }
    


  • 相关阅读:
    用 Python 带你看各国 GDP 变迁
    Fluent Interface(流式接口)
    probing privatePath如何作用于ASP.NET MVC View
    Word插入htm文件导致文本域动态增加的一个问题
    Visual Studio 2013附加进程调试IE加载的ActiveX Control无效解决方法
    Ubuntu下Chrome运行Silverlight程序
    Windows Phone Bing lock screen doesn't change解决方法
    SPClaimsUtility.AuthenticateFormsUser的证书验证问题
    Web Service Client使用Microsoft WSE 2.0
    Visual Studio 2013安装Update 3启动crash的解决方法
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6972865.html
Copyright © 2011-2022 走看看