SOJ-2710(处理点和直线)

来源:互联网 发布:青岛网络约车最新消息 编辑:程序博客网 时间:2024/05/03 06:49

【问题描述】有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;}


原创粉丝点击