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

Обсуждение задачи 1159. Fence

who can help me???i've got WA for mant times
Послано coma 12 июн 2003 13:45
#include <stdio.h>
#include <math.h>

#define PI 3.1415926535

double a[101];
int n;

void init()
{
int i,k;
double t;
scanf("%d",&n);
k=1;
for (i=1;i<=n;i++)
 {
 scanf("%lf",&a[i]);
 if (a[i]>a[k])
  k=i;
 }
t=a[1];
a[1]=a[k];
a[k]=t;
}

double hl(double r,int k)
{
double p;
double s;
p=(a[k]+r+r)/2;
s=p*(p-a[k])*(p-r)*(p-r);
return (sqrt(s));
}

double find_s(int k,double r)
{
int i;
double s;
if (k==0)
 s=-hl(r,1);
else
 s=hl(r,1);
for (i=2;i<=n;i++)
 s=s+hl(r,i);
return (s);
}

double judge(int k,double r)
{
double deg;
int i;
double b,c;
if (k==0)
 deg=2*PI-acos(1-(a[1]*a[1])/(2*r*r));
else
 deg=acos(1-(a[1]*a[1])/(2*r*r));
for (i=2;i<=n;i++)
 deg=deg+acos(1-(a[i]*a[i])/(2*r*r));
return (deg);
}

void solve()
{
int i,k;
double high,low,l;
double mid;
low=a[1]/2;high=1000000;
k=0;
if (judge(1,low)>2*PI)
 k=1;
else
 k=0;
while (high-low>0.00001)
 {
 mid=(high+low)/2;
 l=judge(k,mid);
 if (k==1)
  {
  if (l>PI*2)
   low=mid;
  else
   high=mid;
  }
 if (k==0)
  {
  if (l>PI*2)
   high=mid;
  else
   low=mid;
  }
 }
printf("%.2lf\n",find_s(k,mid));
}

main()
{
int i;
double sum;
init();
sum=0;
for (i=2;i<=n;i++)
 sum=sum+a[i];
if (sum<=a[1])
 printf("0.00\n");
else
solve();
return 0;
}