2012-0021

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

占坑,By FFheyy

就是一个凸包,只需要取上半部分,从左往右扫一遍即可。
{{{
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 1000001;

double x[MAXN], y[MAXN];
int a[MAXN],n;

double dis(const int a, const int b) 
{
    return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}

double check(const int a, const int b, const int c) 
{
    return (x[b] - x[a]) * (y[c] - y[a]) - (x[c] - x[a]) * (y[b] - y[a]);
}

int main() 
{
    int i, j, k;
    double ans;

    while (scanf("%d", &n)!=EOF) 
        {
        for (i=0; i<n; ++i) scanf("%lf%lf", x+i, y+i);
        for (k=i=0; i<n; ++i) 
                {
            for (; k>=2 && check(a[k-2], a[k-1], i)>=0; --k);
            a[k++] = i;
        }
        for (ans=0,i=0; i+1<k; ++i) ans += dis(a[i], a[i+1]);
        printf("%.2lf\n", ans);
    }

    return 0;
}
}}}

占坑,By FFheyy

就是一个凸包,只需要取上半部分,从左往右扫一遍即可。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000001;
double x[MAXN], y[MAXN];
int a[MAXN],n;
double dis(const int a, const int b) 
{
    return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}
double check(const int a, const int b, const int c) 
{
    return (x[b] - x[a]) * (y[c] - y[a]) - (x[c] - x[a]) * (y[b] - y[a]);
}
int main() 
{
    int i, j, k;
    double ans;
    while (scanf("%d", &n)!=EOF) 
        {
        for (i=0; i<n; ++i) scanf("%lf%lf", x+i, y+i);
        for (k=i=0; i<n; ++i) 
                {
            for (; k>=2 && check(a[k-2], a[k-1], i)>=0; --k);
            a[k++] = i;
        }
        for (ans=0,i=0; i+1<k; ++i) ans += dis(a[i], a[i+1]);
        printf("%.2lf\n", ans);
    }
    return 0;
}