zoukankan      html  css  js  c++  java
  • POJ 1696 Space Ant

    卷包裹。

    这是一个变形的极角排序。为什么这样排序就是对的呢?

    因为我们一开始选的左下的点,那么所有的点都在它的上方。如果有点在它的下方,就会出现循环着>0。

    重点在选点的顺序上。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define maxn 105
    #define inf 0x3f3f3f3f
    #define eps 1e-7
    using namespace std;
    struct point
    {
        double x,y;int id;
        point (double x,double y):x(x),y(y) {}
        point () {}
    }p[maxn];
    int n,t,mnx,mny,pos,x;
    bool vis[maxn];
    double rx,ry;
    double cross(const point &x,const point &y) {return (x.x-rx)*(y.y-ry)-(y.x-rx)*(x.y-ry);}
    double dist(const point &x) {return (x.x-rx)*(x.x-rx)+(x.y-ry)*(x.y-ry);}
    bool cmp(const point &x,const point &y)
    {
        double rt=cross(x,y);
        if (fabs(rt)<eps) return dist(x)<dist(y);
        else return rt>0;
    }
    bool cmp1(const point &x,const point &y) {return x.id<y.id;}
    void work()
    {
        memset(vis,false,sizeof(vis));
        scanf("%d",&n);mnx=mny=inf;
        for (int i=1;i<=n;i++)
        {
            scanf("%d%lf%lf",&x,&p[i].x,&p[i].y);
            p[i].id=x;
        }
        sort(p+1,p+n+1,cmp1);
        for (int i=1;i<=n;i++)
        {
            if (p[i].y<mny) {mnx=p[i].x;mny=p[i].y;pos=i;}
            else if ((p[i].y==mny) && (p[i].x<mnx)) {mnx=p[i].x;pos=i;}
        }
        printf("%d ",n);rx=p[pos].x;ry=p[pos].y;
        swap(p[pos],p[1]);
        for (int i=1;i<=n;i++)
        {
            if (i-1) sort(p+i,p+n+1,cmp);
            if (i<n) printf("%d ",p[i].id);
            else printf("%d
    ",p[i].id);
            rx=p[i].x;ry=p[i].y;
        }
    } 
    int main()
    {
        scanf("%d",&t);
        for (int i=1;i<=t;i++) work();
        return 0;    
    }
  • 相关阅读:
    栈与递归
    细说二叉树的删除操作
    二叉树
    链表队列
    数组队列
    链表栈
    c语言实现数组栈
    c语言实现双链表
    HDU 4557 非诚勿扰(Treap找后继)
    POJ 3481 Double Queue(Treap模板题)
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/6279073.html
Copyright © 2011-2022 走看看