SOJ-2710(处理点和直线)

【问题描述】有n个点,问这n个点每两个点连接,不能有点在连接的直线上方,这种点对有多少。

【解题思路】求每个点与它之前的点是否能成一对,从此结点往前扫描,遇到一个点, 如果比维护的高度高,那么这个点就和原来的点组成一对,并把维护的高度记成这个点 

否则跳过此点,扫描更前面的点。

struct my
{
    ll x;
    ll y;
} wo[2005];
bool cmp(my a, my b)
{
    if (a.x < b.x) return true;
    if (a.x == b.x) return a.y < b.y;
    return false;
}
int main()
{
    int t;
    scanf("%d", &t);
    while (t--) {
        int n;
        int i, j;
        scanf("%d", &n);
        for (i = 0; i < n; ++i)
            scanf("%lld%lld", &wo[i].x, &wo[i].y);
        sort(wo, wo + n, cmp);
        int ans = 0;
        for (i = 0; i < n; ++i) {
            double high = -1;
            for (j = i + 1; j < n; ++j) {
                if ((wo[j].y - wo[i].y) * 1.0 / (wo[j].x - wo[i].x) >= high) {
                    ++ans;
                    high = (wo[j].y - wo[i].y) * 1.0 / (wo[j].x - wo[i].x);
                }
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}


你可能感兴趣的:(SOJ-2710(处理点和直线))