ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1185. Wall

Help! Not working
Послано Marko Tintor (marko@pkj.co.yu) 4 июл 2002 17:42
My idea is:

find a minimum convex polygon,
for every edge a in polygon
   w += length of a
   b = edge after a
   w += l * (2PI - angle beetwen a and b)

---------------------

#include <fstream.h>
#include <math.h>
inline double sqr(double x) {return x*x;}
class Vec2D
{
public:
    double x,y;
    Vec2D(double X=0, double Y=0): x(X), y(Y) {}
    Vec2D operator-(Vec2D &a) {return Vec2D(x-a.x,y-a.y);}
    void operator/=(double a) {x/=a; y/=a;}
    double module() {return sqrt(x*x+y*y);}
    double operator*(Vec2D &a) {return x*a.x+y*a.y;}
    double operator^(Vec2D &a) {return sqrt(sqr(x-a.x)+sqr(y-a.y));}
} p[1000], c[1000];
//ifstream fin("wall.dat");
#define fin cin
int i,n,l, e=1;

void main()
{
    fin >> n >> l;
    for(i=0; i<n; i++) fin >> p[i].x >> p[i].y;

    int s=0;
    for(i=1; i<n; i++) if(p[i].x<p[s].x) s=i;
    c[0]=p[s];

    Vec2D d(0,-1), r;
    double h,w;
    int a=s,b;
    while(1)
    {
        b=-1;
        for(i=0; i<n; i++) if(i!=a)
        {
            r=p[i]-p[a];
            h=(d*r)/r.module();
            if(b==-1 || h<=w) {b=i; w=h;}
        }
        if(b==s) break;
        d=p[a]-p[b];
        d/=d.module();
        c[e++]=p[b];
        a=b;
    }

    double wall=0;
    for(i=0; i<e; i++)
    {
        a=(i+1)%e;
        b=(i+2)%e;
        wall+=c[i]^c[a];

        d=c[i]-c[a]; r=c[b]-c[a];
        wall+=l*acos((d*r)/d.module()/r.module());
    }
    cout << long(wall) << endl;
}