poj1106

极坐标排序+叉积判断夹角

View Code
#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <algorithm>

using namespace std;



#define maxn 200

#define eps 1.0e-8



struct Point

{

    int x, y;

}s, point[maxn];



double r;

int n;



bool operator < (const Point &a, const Point &b)

{

    return atan2((double)a.x, (double)a.y) < atan2((double)b.x, (double)b.y);

}



void input()

{

    int cnt = 0;

    scanf("%d", &n);

    for (int i = 0; i < n; i++)

    {

        scanf("%d%d", &point[cnt].x, &point[cnt].y);

        point[cnt].x -= s.x;

        point[cnt].y -= s.y;

        if (r * r > point[cnt].x * point[cnt].x + point[cnt].y * point[cnt].y - eps)

            cnt++;

    }

    n = cnt;

}



double xmulti(Point a, Point b)

{

    return a.x * b.y - a.y * b.x;

}



bool within(Point a, Point b)

{

    return xmulti(b, a) > -eps;

}



int work()

{

    int r = 0;

    int ans = 0;

    for (int i = 0; i < n; i++)

    {

        while (r - i < n && within(point[i], point[r % n]))

            r++;

        ans = max(ans, r - i);

    }

    return ans;

}



int main()

{

    //freopen("t.txt", "r", stdin);

    while (scanf("%d%d%lf", &s.x, &s.y, &r), r >= 0)

    {

        input();

        sort(point, point + n);

        printf("%d\n", work());

    }

    return 0;

}

 

你可能感兴趣的:(poj)