• Space Ant--poj1696(极角排序)


    http://poj.org/problem?id=1696

    极角排序是就是字面上的意思   按照极角排序

    题目大意:平面上有n个点然后有一只蚂蚁他只能沿着点向左走  求最多能做多少点

    分析:  其实还不知道极角排序到底是什么,   但是又好像知道一点   必须一直排序  然后一直找到最左的点就行了

    #include<stdio.h>
    #include<math.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<vector>
    using namespace std;
    #define INF 0xfffffff
    #define ESP 1e-8
    #define memset(a,b) memset(a,b,sizeof(a))
    #define N 2100
    
    struct Point
    {
        double x,y;
        int index;
        Point(double x=0,double y=0):x(x),y(y){}
        Point operator - (const Point &temp)const{
            return Point(x-temp.x,y-temp.y);
        }
        Point operator + (const Point &temp)const{
            return Point(x+temp.x,y+temp.y);
        }
        int operator ^(const Point &temp)const{///求叉积
            double t=(x*temp.y)-(y*temp.x);
            if(t>ESP)
                return 1;
            if(fabs(t)<ESP)
                return 0;
            return -1;
        }
        double operator * (const Point &temp)const{
            return x*temp.x+y*temp.y;
        }
        bool operator == (const Point &temp)const{
            return (x==temp.x)&&(y==temp.y);
        }
    }p[N];
    
    double dist(Point a1,Point a2)
    {
        return sqrt((a1-a2)*(a1-a2));
    }
    int pos=0;
    
    int cmp(Point a1,Point a2)
    {
        int t=(a1-p[pos])^(a2-p[pos]);
        if(t==0)
            return dist(p[pos],a1) < dist(p[pos],a2);
        else if(t<0) return false;
        else
            return true;
    }
    
    int main()
    {
        int T,n;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(int i=0;i<n;i++)
            {
                scanf("%d %lf %lf",&p[i].index,&p[i].x,&p[i].y);
                if(p[i].y<p[0].y || (p[i].y==p[0].y && p[i].x<p[0].x))
                    swap(p[i],p[0]);
            }
            pos=0;
    
            for(int i=1;i<n;i++)
            {
                sort(p+i,p+n,cmp);
                pos++;
            }
            printf("%d",n);
            for(int i=0;i<n;i++)
                printf(" %d",p[i].index);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    读取列表下标
    字典dict详解
    使用mysql的长连接
    oauth授权协议的原理
    安装性能测试工具:sysbench和使用apache的ab
    发送邮件出现问题
    获取用户的真实ip
    清理代码的阅读笔记
    开发中三个经典的原则
    要干大事就不能把面子看得太重
  • 原文地址:https://www.cnblogs.com/linliu/p/5478021.html
Copyright © 2020-2023  润新知