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

Обсуждение задачи 1093. Дартс

what's wrong with this program?
Послано Alyosha Popovich 6 окт 2001 01:15
#include <stdio.h>
#include <math.h>

double C[3], R, N[3];
double S[3], V[3];

void read_data()
{
    scanf("%lf %lf %lf %lf %lf %lf %lf", C, C+1, C+2, N,
N+1, N+2, &R);
    scanf("%lf %lf %lf %lf %lf %lf %lf", S, S+1, S+2, V,
V+1, V+2);
}

#define missed { printf("MISSED\n"); return;}

#define sqr(a) ((a) * (a))
void solve()
{
    double a, b, c, delta, t, t1, x, y, z;
    a = - 5*N[2];
    b = N[0]*V[0] + N[1]*V[1] + N[2]*V[2];
    c = N[0]*(S[0]-C[0]) + N[1]*(S[1]-C[1]) + N[2]*(S[2]-C
[2]);
    if (fabs(a) < 0.0000001)
    {
        if (fabs(b) < 0.0000001) missed;
        t = - c / b;
    }
    else
    {
        delta = b*b - 4*a*c;
        if (delta < 0) missed;
        delta = sqrt(delta);
        t = (-b + delta) / (2*a);
        t1 = (-b - delta) / (2*a);
        if (t < 0 || (t1 >= 0 && t1 < t)) t = t1;
    }
    if (t < 0) missed;
    x = S[0] + V[0] * t;
    y = S[1] + V[1] * t;
    z = S[2] + V[2] * t - 5*t*t;
    if (sqr(x-C[0]) + sqr(y-C[1]) + sqr(z-C[2]) >= R*R-
0.000001) missed;
    printf("HIT\n");
}

void main()
{
    read_data();
    solve();
}