Форум Всеукраїнської інтернет-олімпіади NetOI


На форумі обговорюються лише питання, пов'язані з олімпіадою

Ви не зайшли.

#101 2008-01-10 22:09:28

RuslanSM
Новий користувач
Зареєстрований: 2006-10-20
Повідомлень: 21

Re: Барабанная дробь...

2Oracle: Так само як і в тебе. Чому пролітає не знаю, не можу знайти баг sad. Багато тестував цей таск на рандомних тестах та перевіряв ПП. Хоча мої ПП зазвичай дуже кумедно написані, але все-ж таки не віриться у те, що ніхто не зробив задачу правильно.

Поза форумом

 

#102 2008-01-10 22:14:59

MAXXX
Новий користувач
Звідки: м. Київ
Зареєстрований: 2006-10-17
Повідомлень: 132

Re: Барабанная дробь...

Можна питання? Що таке ПП? думав -щось на кшалт "перевіряюча програма", проте

RuslanSM написав:

Влад а ти вважаєш, що машина може зробити пару циклів, і береш відповідь по модулю???
Бо інакше правильність твоєї відповіді під великим сумнівом для мене і мого ПП wink.

Мого ПП - чоловічий рід. Що ж це таке?smile

Відредаговано MAXXX (2008-01-10 22:15:38)


ICQ 426287475

Поза форумом

 

#103 2008-01-10 22:30:01

RuslanSM
Новий користувач
Зареєстрований: 2006-10-20
Повідомлень: 21

Re: Барабанная дробь...

Повний перебір wink

Поза форумом

 

#104 2008-01-10 22:38:30

Oracle
Новий користувач
Звідки: Львів
Зареєстрований: 2007-10-24
Повідомлень: 13

Re: Барабанная дробь...

To_RuslanSM: Шось мені теж здається шо ті тести не зовсім вірні - в мене 55, але я на 99% впевнений, що моя програма працює правильно. Працює для багатьох рендомних тестів (які можна перевірити вручну) і для кількох десятків написаних вручну.

Ось мій сорс, може когось зацікавить - перетин кіл кожного з кожним, за допомогою перетину дуг:

Код:

#include <iostream>
#include <math.h>
using namespace std;


const double inf=(1e7);
const double eps=1e-7;
const double PI=3.1415926535897932384626433832795;

struct
{
    double x,y,v;
} a[101];

struct TSeg
{
    double min,max;
};

struct TList
{
    TSeg s[101];
    int size;
};

void inline push_back(TList& l,TSeg seg) 
{
    l.s[l.size].max=seg.max;l.s[l.size].min=seg.min; ++l.size;
}

struct
{
    double x,y,r;
    TList seg;
    bool was;
} v[101];

double aline[101][101];

int n;

bool eq(double x,double y)
{
    return (fabs(x-y)<eps);
}

double len(double x1,double y1,double x2,double y2)
{
    return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}

void norm(double& mn,double& mx)
{
    while (mn<-eps) mn+=2*PI; if (mn<0) mn=0;
    while (mn-eps>mx)
        mx+=2*PI;
    while (mx-eps>(mn+2*PI))
        mx-=2*PI;
    while ((mn-eps>=2*PI)&&(mx-eps>=2*PI))
    {
        mn-=2*PI;
        mx-=2*PI;
    }
}

void getintr(int ind,double amn,double amx)
{
norm(amn,amx);
TList res;
res.size=0;
TSeg cur;
for (int i=0;i<v[ind].seg.size;++i)
{
    cur=v[ind].seg.s[i];
    if (cur.max<=2*PI+eps)
    {
        if (amx<=2*PI+eps) {
            cur.min=max(cur.min,amn);
            cur.max=min(cur.max,amx);
            if (cur.min<cur.max)
                push_back(res,cur);
        } else {
            if (cur.min+2*PI<=amx+eps) {
                if (cur.max+eps>=amn) {
                    TSeg seg;seg.max=cur.max;seg.min=max(amn,cur.min);
                    push_back(res,seg);
                }
                cur.max=min(amx-2*PI,cur.max);
                push_back(res,cur);
            } else    if (cur.max+eps>=amn) {cur.min=max(amn,cur.min); push_back(res,cur);}
        }
    } else {
        if (amx<=2*PI+eps) {
            if (amn+2*PI<=cur.max+eps) {
                if (amx+eps>=cur.min) {
                    TSeg seg;seg.max=amx; seg.min=max(cur.min,amn);
                    push_back(res,seg);
                }
                cur.max=min(amx,cur.max-2*PI);
                cur.min=amn;
                push_back(res,cur);
            } else    if (amx+eps>=cur.min) { cur.max=amx; cur.min=max(amn,cur.min); push_back(res,cur); }
        } else
        {
            cur.min=max(cur.min,amn);
            cur.max=min(cur.max,amx);
            push_back(res,cur);
        }
    } 
}
v[ind].seg=res;
for (int i=0;i<v[ind].seg.size;++i)
 norm(v[ind].seg.s[i].min,v[ind].seg.s[i].max);
}

void intersect(int f,int s)
{
double x=len(v[f].x,v[f].y,v[s].x,v[s].y);
if (x>v[s].r+v[f].r)
{
    v[s].seg.size=0;
    v[f].seg.size=0;
    return;
}

double a1=acos((x*x+v[f].r*v[f].r-v[s].r*v[s].r)/(2*v[f].r*x));

getintr(f,aline[f][s]-a1,aline[f][s]+a1);
}

void deleteincludes()
{
int i,j;
for (i=0;i<n;i++)
{
     for (j=i+1;j<n;j++)
     {
         if (len(v[i].x,v[i].y,v[j].x,v[j].y)+min(v[i].r,v[j].r)+eps<max(v[i].r,v[j].r))
         {
             if (v[i].r<v[j].r)
                v[j].was=true; else
             if (v[i].r>v[j].r) 
                v[i].was=true; else
                v[i].was=v[j].was=true;
         }
     }
}
for (i=0;i<n;i++)
 for (j=i+1;j<n;j++)
     if ((v[i].was==false)&&(v[i].x==v[j].x)&&(v[i].y==v[j].y)&&(v[i].r==v[j].r))
        v[j].was=true;
}

bool haspoint()
{
    deleteincludes();
    bool buf=false;
    for (int i=0;i<n;i++)
        if (v[i].was==false)
        {
            buf=true;
            break;
        }
    if (!buf) return true;

    for (int i=0;i<n;i++)
        if (v[i].was==false)
        for (int j=0;j<n;j++)
        if ((v[j].was==false)&&(i!=j))
            intersect(i,j);
    bool res=false;
    for (int i=0;i<n;i++)
    {
        if ((v[i].seg.size>0)&&(v[i].was==false))
        {
            res=true;
            break;
        }
    }
    /*if (res)
    {
    printf("rad = %.3lf \n",v[0].r);
    for (int i=0;i<n;i++)
    for (int k=0;k<v[i].seg.size;k++)
        printf("%d: %.3lf %.3lf was = %d \n",i,v[i].seg.s[k].min*180/PI,v[i].seg.s[k].max*180/PI,v[i].was);
    int l=0;
    while ((v[l].was==true)||(v[l].seg.size==0)) ++l;
    double x=cos(v[l].seg.s[0].min)*v[l].r+v[l].x;
    double y=sin(v[l].seg.s[0].min)*v[l].r+v[l].y;
    printf("point: %.3lf %.3lf \n",x,y);
    for (int i=0;i<n;i++)
        printf("dist to %d: %.3lf time for %d: %.3lf\n",i,len(v[i].x,v[i].y,x,y),i,len(v[i].x,v[i].y,x,y)/a[i].v);
    }*/
    return res;
}

void solve()
{
    double mnt=0,mxt=inf;
    double res;
    TSeg seg;
    while ((mxt-mnt)>eps)
    {
        res=(mnt+mxt)/2;
        for (int i=0;i<n;i++)
        {
            v[i].r=a[i].v*res;
            v[i].seg.size=0;
            seg.max=2*PI; seg.min=0;
            push_back(v[i].seg,seg);
            v[i].was=false;
        }
        if (haspoint())
            mxt=res; else
            mnt=res;
    }
    printf("%.10lf",res);
}

void genaline()
{
    for (int i=0;i<n;i++)
        for (int j=0;j<n;j++)
            if (i!=j)    aline[i][j]=atan2((a[j].y-a[i].y),(a[j].x-a[i].x));
}

int main()
{
    scanf("%d",&n);
    for (int i=0;i<n;i++)
    {
        scanf("%lf %lf %lf",&a[i].x,&a[i].y,&a[i].v);
        v[i].x=a[i].x;v[i].y=a[i].y;
    }
    genaline();
    solve();
    return 0;
}

Відредаговано Oracle (2008-01-10 22:57:11)


ICQ: 492581744

Поза форумом

 

#105 2008-01-11 02:17:48

Гіпс
Новий користувач
Зареєстрований: 2008-01-10
Повідомлень: 1

Re: Барабанная дробь...

Я задачу Navy розвязував пошуком найбільшого часу який потрібно затратити до зустрічі між 2 любими кораблями(між всіма парами і складність виходить n^2) взяв 50 балів за неї(всі 10 помилок ВА)sad
Якщо хтось має толкові тест до цієї задачі киньте будь ласка або протестіть самі, а найбільше буду вдячний, якщо хтось розкаже чого алгоритм не добрий:)

Код:

program Navy;

Type PoiV=Record
  X,Y,V:Single;
End;
Var N:Integer;
  T:Single;
  Masuv:Array[1..105] Of PoiV;
  Procedure Vxid;
  Var A:Integer;
  Begin
    Read(N);
    For A:=1 To N-1 Do Begin
      Read(Masuv[A].X,Masuv[A].Y,Masuv[A].V);
    End;
    Readln(Masuv[N].X,Masuv[N].Y,Masuv[N].V);
  End;
  Procedure Obrobka;
  Var A,S:Integer;
  pr:Single;
  Begin
    T:=0;
    For A:=1 To N-1 Do Begin
      For S:=A+1 To N Do Begin
        Pr:=( (Masuv[A].X-Masuv[S].X)*(Masuv[A].X-Masuv[S].X)
        +(Masuv[A].Y-Masuv[S].Y)*(Masuv[A].Y-Masuv[S].Y))
        /( (Masuv[A].V+Masuv[S].V)*(Masuv[A].V+Masuv[S].V));
        If Pr>T Then Begin
          T:=Pr;
        End;
      End;
    End;
  end;
  Procedure Vuxid;
  Begin
    Writeln(Sqrt(T):5:3);
  end;
begin
  Vxid;
  Obrobka;
  Vuxid;
end.

Відредаговано Гіпс (2008-01-11 02:19:28)

Поза форумом

 

#106 2008-01-11 06:06:54

paul
Новий користувач
Зареєстрований: 2007-11-13
Повідомлень: 8

Re: Барабанная дробь...

ненормально, что перебор по парам набирает 50 баллов. Может, жюри стоит пересобрать набор тестов. По моему скромному мнению такие упрощенные решения должны набирать не более четверти баллов.

Поза форумом

 

#107 2008-01-11 09:11:59

RuslanSM
Новий користувач
Зареєстрований: 2006-10-20
Повідомлень: 21

Re: Барабанная дробь...

2paul: Не впевнений, що журі щось змінить. Згадайте Всукраїнську (таск про кур'єрів), і минулі Вінницькі олімпіади (там теж схожі проблеми іноді траплялось).

Поза форумом

 

#108 2008-01-11 09:25:23

kadr
Новий користувач
Зареєстрований: 2007-11-29
Повідомлень: 75

Re: Барабанная дробь...

Гіпс написав:

Я задачу Navy розвязував пошуком найбільшого часу який потрібно затратити до зустрічі між 2 любими кораблями(між всіма парами і складність виходить n^2) взяв 50 балів за неї(всі 10 помилок ВА)sad
Якщо хтось має толкові тест до цієї задачі киньте будь ласка або протестіть самі, а найбільше буду вдячний, якщо хтось розкаже чого алгоритм не добрий:)

Потому что когда 2 каких-то корабля встретятся за определенное время - еще не значит что до той точки где они встретятся остальные корабли доедут за время, меньше этого...

Пример:
3 корабля с равными скоростями находятся в вершинах равностороннего треугольника. Если просматривать все пары кораблей, то программа выдаст время, которое потребуется на то, чтобы 2 соседних корабля достигли середины стороны. Но ведь за это время 3-й корабль не успеет туда дойти. Хотя если он будет двигаться к центроиду, то потребуется даже меньшее время. Поэтому, ответом будет время, за которое корабли достигнут центроида этого треугольника.

Відредаговано kadr (2008-01-11 09:26:51)

Поза форумом

 

#109 2008-01-11 09:45:28

MAXXX
Новий користувач
Звідки: м. Київ
Зареєстрований: 2006-10-17
Повідомлень: 132

Re: Барабанная дробь...

partisan написав:

Skiminok написав:

MAXXX написав:

ОГО! рішення з перетином кожних 2 кіл - 50 баллів!!!!!!!!!!!!!!!!!!!!НЕЙМОВІРНО!!!!!!!!!!!Написав би так - був би першим(( Ти везунчик, справді)

У меня большое подозрение, что, если его чуть-чуть модифицировать на частные случаи - может набрать полный балл wink

Это решение валится, когда точка схождения 3х находится внутри треугольника. Вот тогда нужна математика. Мой куб однако немного таймит. А онлайн сейчас пашет. Нахождение точки схождения 3х (почитайте пост про теорему Хелли. Такие тесты несложно подобрать) довольно громоздское, однако один из подходов таки находит нужное время (описано в моем посте раньше).

Або ось більш загально чому таке рішення валиться

paul написав:

ненормально, что перебор по парам набирает 50 баллов. Может, жюри стоит пересобрать набор тестов. По моему скромному мнению такие упрощенные решения должны набирать не более четверти баллов.

+1

RuslanSM написав:

2paul: Не впевнений, що журі щось змінить. Згадайте Всукраїнську (таск про кур'єрів), і минулі Вінницькі олімпіади (там теж схожі проблеми іноді траплялось).

але тут бували і прецеденти, коли тести змінували (здається 4 тур 2 роки тому)


ICQ 426287475

Поза форумом

 

#110 2008-01-11 10:22:04

Oracle
Новий користувач
Звідки: Львів
Зареєстрований: 2007-10-24
Повідомлень: 13

Re: Барабанная дробь...

2Гіпс: ось тести на яких твоя програма валиться 
3 -2 0 1 0 3.464 1 2 0 1  /2.309
4 0 0 2 2 0 1 4 0 2 2 3 2 /1.083
7 0 -0.4 1 1 1.3 1 2.3 1.301 1 3 0.2 1 3 -0.6 1 -1.3 -1.7 1 1 -1.3 1 /2.370
і таких ше можна написати сотні...


ICQ: 492581744

Поза форумом

 

#111 2008-01-11 10:33:33

Журі_Пасіхов
Гість

Re: Барабанная дробь...

MAXXX написав:

Хм....питання до жюрі:
Мій лого на онлайн-перевірці отримує 60 балів з часом на максимальний тест 0.19с. А в таблиці результатів у мене 57 балів. Поясніть, будь-ласка.

Протокол офіційної пепевірки розв'язку учасника RQ7496

RQ7496:LOGO:00: PASSED (+0) [time: 0.01, exit code: 0]
RQ7496:LOGO:01: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:02: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:03: PASSED (+3) [time: 0.02, exit code: 0]
RQ7496:LOGO:04: PASSED (+3) [time: 0.02, exit code: 0]
RQ7496:LOGO:05: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:06: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:07: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:08: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:09: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:10: PASSED (+3) [time: 0.01, exit code: 0]
RQ7496:LOGO:11: PASSED (+3) [time: 0.03, exit code: 0]
RQ7496:LOGO:12: PASSED (+3) [time: 0.02, exit code: 0]
RQ7496:LOGO:13: PASSED (+3) [time: 0.03, exit code: 0]
RQ7496:LOGO:14: PASSED (+3) [time: 0.06, exit code: 0]
RQ7496:LOGO:15: PASSED (+3) [time: 0.06, exit code: 0]
RQ7496:LOGO:16: PASSED (+3) [time: 0.08, exit code: 0]
RQ7496:LOGO:17: PASSED (+3) [time: 0.10, exit code: 0]
RQ7496:LOGO:18: PASSED (+3) [time: 0.15, exit code: 0]
RQ7496:LOGO:19: PASSED (+3) [time: 0.17, exit code: 0]
RQ7496:LOGO:20: FAILED (Time Out) [time: 0.20, exit code: 0]

Протокол офіційної пепевірки розв'язку учасника XO4673

XO4673:LOGO:00: PASSED (+0) [time: 0.01, exit code: 0]
XO4673:LOGO:01: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:02: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:03: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:04: PASSED (+3) [time: 0.02, exit code: 0]
XO4673:LOGO:05: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:06: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:07: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:08: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:09: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:10: PASSED (+3) [time: 0.02, exit code: 0]
XO4673:LOGO:11: PASSED (+3) [time: 0.01, exit code: 0]
XO4673:LOGO:12: PASSED (+3) [time: 0.03, exit code: 0]
XO4673:LOGO:13: PASSED (+3) [time: 0.04, exit code: 0]
XO4673:LOGO:14: PASSED (+3) [time: 0.04, exit code: 0]
XO4673:LOGO:15: PASSED (+3) [time: 0.06, exit code: 0]
XO4673:LOGO:16: PASSED (+3) [time: 0.08, exit code: 0]
XO4673:LOGO:17: PASSED (+3) [time: 0.11, exit code: 0]
XO4673:LOGO:18: PASSED (+3) [time: 0.15, exit code: 0]
XO4673:LOGO:19: PASSED (+3) [time: 0.17, exit code: 0]
XO4673:LOGO:20: FAILED (Time Out) [time: 0.20, exit code: 0]

Обидва (за реєстрацією) - Андрій Максай. Обидва текста програми ідентичні  (є ща і третій код п. Максая, але на нього розв'язки не надсилались) До слова, а для чого таке дублювання? Нам недовіра? Чи собі?

В обох випадках останній тест проходить правильно, але  на межі тайм-ліміту (0.2 с). - не зараховано.

В он-лайн перевірці в де-яких випадках ( в мене 1 з 5-ти запусків) тест проходть за 0.19 с.  і зараховується. Режим он-лайн перевірки дещо відрізняється від режиму офіційної (пакетної, в однокористувацькому режимі), тому таке може трапитися.

В принципі, в БУДЬ-ЯКОМУ режимі в БУДЬ-ЯКІЙ перевіряючій системі, якщо тест проходить за час "на грані тіка" процесора, можливі прояви нестабільності результата. Тому ми даємо час на тест в 2 рази більший, ніж у найкращого (правда, на думку журі) розв'язку. Інколи роблять і по-іншому, але це вже друге питання.

Ось протокол перевірки авторського розв'язку

IZ8544:LOGO:00: PASSED (+0) [time: 0.01, exit code: 0]
IZ8544:LOGO:01: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:02: PASSED (+3) [time: 0.02, exit code: 0]
IZ8544:LOGO:03: PASSED (+3) [time: 0.02, exit code: 0]
IZ8544:LOGO:04: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:05: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:06: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:07: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:08: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:09: PASSED (+3) [time: 0.02, exit code: 0]
IZ8544:LOGO:10: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:11: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:12: PASSED (+3) [time: 0.01, exit code: 0]
IZ8544:LOGO:13: PASSED (+3) [time: 0.03, exit code: 0]
IZ8544:LOGO:14: PASSED (+3) [time: 0.03, exit code: 0]
IZ8544:LOGO:15: PASSED (+3) [time: 0.04, exit code: 0]
IZ8544:LOGO:16: PASSED (+3) [time: 0.04, exit code: 0]
IZ8544:LOGO:17: PASSED (+3) [time: 0.04, exit code: 0]
IZ8544:LOGO:18: PASSED (+3) [time: 0.06, exit code: 0]
IZ8544:LOGO:19: PASSED (+3) [time: 0.10, exit code: 0]
IZ8544:LOGO:20: PASSED (+3) [time: 0.10, exit code: 0]

Я вважаю питання вичерпаним.

PS Конфіденційність кодів тепер не суттєва. На 4-1 тур буде нова реєстрація

 

#112 2008-01-11 11:29:47

V@ny@
Новий користувач
Зареєстрований: 2007-12-17
Повідомлень: 13

Re: Барабанная дробь...

ПИТАННЯ ДО ЖУРІ:
1) Прошу переоцінити задачу NewGarden;
    На он-лайн перевірці задача проходить 15 з 16 тестів, а у таблиці результатів 0 балів.
2) Аналогічно всі інші, крім LOGO і SightSeeing.
З повагою, Іван Маховський

Поза форумом

 

#113 2008-01-11 11:50:00

Журі_Пасіхов
Гість

Re: Барабанная дробь...

V@ny@ написав:

ПИТАННЯ ДО ЖУРІ:
1) Прошу переоцінити задачу NewGarden;
    На он-лайн перевірці задача проходить 15 з 16 тестів, а у таблиці результатів 0 балів.
2) Аналогічно всі інші, крім LOGO і SightSeeing.
З повагою, Іван Маховський

Вот решение, которое Вы прислали:

Код:

{$A+,B-,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+}
{$M 16384,0,655360}

type arr = array[1..1500] of byte;
var
   b : array[1..5] of integer;
   m, n, t, i, j, p, k, s : integer;
   tsss, sss1, sss : arr;
   ctsss, csss1, csss : integer;
   a, c : arr;
   na, nb, nc : integer;
   ck : array[0..5] of arr;
   cck : array[0..5] of integer;
   ct : array[0..25] of arr;
   cct : array[0..25] of integer;

function max(a, b : integer): integer;
begin
     if a>b then max:=a else max:=b;
end;

function min(a, b : integer): integer;
begin
     if a>b then min:=b else min:=a;
end;

procedure trans(n : longint; var c : arr; var k : integer);
begin
     k:=0;
     while n>0 do
     begin
          inc(k);
          c[k]:=n mod 10;
          n:=n div 10;
     end;
end;

procedure summ(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer);
var t,i : byte;
begin
     t:=0; k:=max(m,n);
     for i:=1 to k do
     begin
          c[i]:=a[i]+b[i]+t;
          t:=c[i] div 10;
          c[i]:=c[i] mod 10;
     end;
     if t>0 then begin
        k:=k+1; c[k]:=t;
     end;
end;

procedure multiply(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer);
var i, j, p : integer;
    t : byte;
    cc : arr;
begin
     fillchar(c,sizeof(c),0); k:=0;
     for i:=1 to m do
     begin
       t:=0; cc[i-1]:=0;
       for j:=1 to n do
       begin
          cc[j+i-1]:=b[j]*a[i]+t;
          t:=cc[j+i-1] div 10;
          cc[j+i-1]:=cc[j+i-1] mod 10;
       end;
       if t>0 then begin p:=n+i; cc[p]:=t; end else p:=n+i-1;
       summ(c,k,cc,p,c,k);
     end;
end;

procedure step(n : integer; a : arr; m: integer; var c : arr; var k: integer);
var i, j, p : integer;
    t : byte;
    cc : arr;
begin
     fillchar(c,sizeof(c),0); c[1]:=1; k:=1;
     for i:=1 to n do multiply(c,k,a,m,c,k);
end;

procedure ccc(a, b : integer; var c : arr; var k: integer);
var  p, q : array[0..25] of longint;
     ss1, ss2 :int64;
     i, j : integer;
begin
     if a>(b div 2) then a:=b-a;
     for i:=b downto b-a+1 do
     begin
          p[b-i+1]:=i; q[b-i+1]:=b-i+1;
     end;
     for i:=a downto 1 do
     for j:=a downto 1 do
         if p[j] mod q[i]=0 then begin
            p[j]:=p[j] div q[i]; q[i]:=1;
            break;
         end;
     ss1:=1; ss2:=1;
     for i:=1 to a do
     begin
        ss1:=ss1*p[i];
        ss2:=ss2*q[i];
     end;
     ss1:=ss1 div ss2;
     trans(ss1,c,k);
end;

procedure write_result;
begin
     for i:=csss downto 1 do write(sss[i]);
     writeln;
     halt;
end;

begin
     read(n,m,k);
     t:=min(m-1,n-m); csss:=0; fillchar(sss,sizeof(sss),0);
     for i:=1 to t do
         b[i]:=0;
     for i:=0 to m do ccc(i,m,ck[i],cck[i]);
     for i:=0 to sqr(m)-t*m do
         ccc(i,sqr(m)-t*m,ct[i],cct[i]);

     while true do
     begin
          s:=0; csss1:=1; fillchar(sss1,sizeof(sss1),0); sss1[1]:=1;
          for i:=1 to t do
          begin
               s:=s+b[i];
               step(trunc((n-i)/m)+1,ck[b[i]],cck[b[i]],tsss,ctsss);
               multiply(sss1,csss1,tsss,ctsss,sss1,csss1);
          end;
          if k-s<=sqr(m)-t*m then begin
            step(trunc(n/m),ct[k-s],cct[k-s],tsss,ctsss);
            multiply(sss1,csss1,tsss,ctsss,sss1,csss1);
            summ(sss,csss,sss1,csss1,sss,csss);
          end;
          if k=s then begin
             p:=t;
             while (b[p]=0) and (p>0) do dec(p);
             if ((p=(k div m)) and ((k mod m)=0))
                or ((p=(k div m)+1) and ((k mod m)=b[p])) then begin
                write_result;
             end;
             b[p]:=0; dec(p);
             while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end;
             inc(b[p]);
          end
          else begin
             p:=t;
             while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end;
             if p=0 then begin
                write_result;
             end;
             inc(b[p]);
          end;
     end;
end.

А вот что оно выдает на он-лайн проверке

Тест Результат Время работы
00 FAILED (Bad Data) 0.01 сек.
01 FAILED (Bad Data) 0.01 сек.
02 FAILED (Bad Data) 0.01 сек.
03 FAILED (Bad Data) 0.01 сек.
04 FAILED (Bad Data) 0.01 сек.
05 FAILED (Bad Data) 0.01 сек.
06 FAILED (Bad Data) 0.01 сек.
07 FAILED (Bad Data) 0.01 сек.
08 FAILED (Bad Data) 0.01 сек.
09 FAILED (Bad Data) 0.01 сек.
10 FAILED (Bad Data) 0.01 сек.
11 FAILED (Bad Data) 0.01 сек.
12 FAILED (Bad Data) 0.01 сек.
13 FAILED (Bad Data) 0.01 сек.
14 FAILED (Bad Data) 0.01 сек.
15 FAILED (Bad Data) 0.01 сек.

Прошло тестов: 0 из 16.

Набрано баллов: 0 из 60.


Ваша претензия НЕОБОСНОВАНА.

 

#114 2008-01-11 12:18:10

RuslanSM
Новий користувач
Зареєстрований: 2006-10-20
Повідомлень: 21

Re: Барабанная дробь...

2V@ny@: Первеір свій таск на стек оверлоу. З функцій step ти визиваєш multiply і потім summ, і в кожній з функцій виділяєш стекову пам'ять. При цьому досить сильно обмежуєш стекову пам'ять в строчці {$M 16384,0,655360}.

Відредаговано RuslanSM (2008-01-11 12:18:34)

Поза форумом

 

#115 2008-01-11 12:28:58

guest1
Новий користувач
Зареєстрований: 2006-12-19
Повідомлень: 309
Вебсайт

Re: Барабанная дробь...

Похоже, дело в строчке с директивой{$M ...}, т. к. на турбо это компилируется, а на фри - нет.

Поза форумом

 

#116 2008-01-11 12:49:20

partisan
Олімпієць
Звідки: Киев
Зареєстрований: 2005-11-04
Повідомлень: 180

Re: Барабанная дробь...

Oracle написав:

Народ в кого які тести не пройшли у Navy? В мене 17, 21, 26, 38, 60

2,17,21,26,38 - ВА. 49,57-61 - ТЛ.

Співпадає до речі.
Ти як робив? (мій розв'язок є раніше)

Поза форумом

 

#117 2008-01-11 13:24:19

Oracle
Новий користувач
Звідки: Львів
Зареєстрований: 2007-10-24
Повідомлень: 13

Re: Барабанная дробь...

partisan написав:

Oracle написав:

Народ в кого які тести не пройшли у Navy? В мене 17, 21, 26, 38, 60

2,17,21,26,38 - ВА. 49,57-61 - ТЛ.

Співпадає до речі.
Ти як робив? (мій розв'язок є раніше)

Мій код є вище, робив так: бінарний пошук по часу; для знаходження чи круги мають спільну точку: для кожного кола знаходив дуги, які належать решті кругів, це робив за допомогою перетину відрізків (дуги представляю в вигляді початкового кута і кінцевого кута - тому вони мають вигляд відрізка [поч.кут;кін.кут]), якщо хоч одне коло після таких перетинів містить хоч 1 дугу - значить і всі кола мають спільну точку. Цей розвязок мало схожий на твій з використанням теореми Хеллі.


ICQ: 492581744

Поза форумом

 

#118 2008-01-11 15:21:54

AntiXrist
Новий користувач
Зареєстрований: 2007-10-31
Повідомлень: 22

Re: Барабанная дробь...

Скажите, а можна увидеть сами тесты на задачку LOGO???
Очень хотелось бы увидеть smile

Поза форумом

 

#119 2008-01-11 15:32:25

reiten
журі
Звідки: Киев
Зареєстрований: 2005-10-16
Повідомлень: 196

Re: Барабанная дробь...

К сожалению, только после завершения 4го тура вместе с остальными материалами олимпиады.


"...Существуют два подхода к проектированию программ. В одном архитектура делается настолько простой, что в ней явно нет дефектов; в другом - настолько сложной, что в ней нет явных дефектов".
С. А. Хоар

Поза форумом

 

#120 2008-01-11 15:35:33

RuslanSM
Новий користувач
Зареєстрований: 2006-10-20
Повідомлень: 21

Re: Барабанная дробь...

2guest1: Чогось мені здаєтся, що ти неправий wink. Все добре компілюєтся. А якщо поставити величину стеку в 4 метри то ще й проходить усі тести (крім одного за ТЛ) smile

Поза форумом

 

#121 2008-01-11 15:38:18

AntiXrist
Новий користувач
Зареєстрований: 2007-10-31
Повідомлень: 22

Re: Барабанная дробь...

жаль... sad значит будем ждать.
И еще вопросик, чё там с 4 туром? Когда будет проводится???

Поза форумом

 

#122 2008-01-11 16:14:17

MAXXX
Новий користувач
Звідки: м. Київ
Зареєстрований: 2006-10-17
Повідомлень: 132

Re: Барабанная дробь...

Журі_Пасіхов написав:

Обидва (за реєстрацією) - Андрій Максай. Обидва текста програми ідентичні  (є ща і третій код п. Максая, але на нього розв'язки не надсилались) До слова, а для чого таке дублювання? Нам недовіра? Чи собі?

Третій аккаунт з'явився через те, що мені довго не приходили підтверждення про перші 2 реєстрації.
А практику 2 аккаунтів я веду ще з минулого року.
По-перше, це корисно - можна по-різному здавати задачі(так я робив у 1 задачі 1 і 2 туру) - якщо є якісь помилки в 1 варіанті, то пройде інший.
По-друге, це надійно - коли здавав 1 разу, мені здалося, що я забув прибрати system("PAUSE");
По-третє - це не заборонено, а мені так просто комфортніше - такий вже яsmile


ICQ 426287475

Поза форумом

 

#123 2008-01-11 17:33:42

V@ny@
Новий користувач
Зареєстрований: 2007-12-17
Повідомлень: 13

Re: Барабанная дробь...

Журі_Пасіхов написав:

V@ny@ написав:

ПИТАННЯ ДО ЖУРІ:
1) Прошу переоцінити задачу NewGarden;
    На он-лайн перевірці задача проходить 15 з 16 тестів, а у таблиці результатів 0 балів.
2) Аналогічно всі інші, крім LOGO і SightSeeing.
З повагою, Іван Маховський

Вот решение, которое Вы прислали:

Код:

{$A+,B-,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+}
{$M 16384,0,655360}

type arr = array[1..1500] of byte;
var
   b : array[1..5] of integer;
   m, n, t, i, j, p, k, s : integer;
   tsss, sss1, sss : arr;
   ctsss, csss1, csss : integer;
   a, c : arr;
   na, nb, nc : integer;
   ck : array[0..5] of arr;
   cck : array[0..5] of integer;
   ct : array[0..25] of arr;
   cct : array[0..25] of integer;

function max(a, b : integer): integer;
begin
     if a>b then max:=a else max:=b;
end;

function min(a, b : integer): integer;
begin
     if a>b then min:=b else min:=a;
end;

procedure trans(n : longint; var c : arr; var k : integer);
begin
     k:=0;
     while n>0 do
     begin
          inc(k);
          c[k]:=n mod 10;
          n:=n div 10;
     end;
end;

procedure summ(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer);
var t,i : byte;
begin
     t:=0; k:=max(m,n);
     for i:=1 to k do
     begin
          c[i]:=a[i]+b[i]+t;
          t:=c[i] div 10;
          c[i]:=c[i] mod 10;
     end;
     if t>0 then begin
        k:=k+1; c[k]:=t;
     end;
end;

procedure multiply(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer);
var i, j, p : integer;
    t : byte;
    cc : arr;
begin
     fillchar(c,sizeof(c),0); k:=0;
     for i:=1 to m do
     begin
       t:=0; cc[i-1]:=0;
       for j:=1 to n do
       begin
          cc[j+i-1]:=b[j]*a[i]+t;
          t:=cc[j+i-1] div 10;
          cc[j+i-1]:=cc[j+i-1] mod 10;
       end;
       if t>0 then begin p:=n+i; cc[p]:=t; end else p:=n+i-1;
       summ(c,k,cc,p,c,k);
     end;
end;

procedure step(n : integer; a : arr; m: integer; var c : arr; var k: integer);
var i, j, p : integer;
    t : byte;
    cc : arr;
begin
     fillchar(c,sizeof(c),0); c[1]:=1; k:=1;
     for i:=1 to n do multiply(c,k,a,m,c,k);
end;

procedure ccc(a, b : integer; var c : arr; var k: integer);
var  p, q : array[0..25] of longint;
     ss1, ss2 :int64;
     i, j : integer;
begin
     if a>(b div 2) then a:=b-a;
     for i:=b downto b-a+1 do
     begin
          p[b-i+1]:=i; q[b-i+1]:=b-i+1;
     end;
     for i:=a downto 1 do
     for j:=a downto 1 do
         if p[j] mod q[i]=0 then begin
            p[j]:=p[j] div q[i]; q[i]:=1;
            break;
         end;
     ss1:=1; ss2:=1;
     for i:=1 to a do
     begin
        ss1:=ss1*p[i];
        ss2:=ss2*q[i];
     end;
     ss1:=ss1 div ss2;
     trans(ss1,c,k);
end;

procedure write_result;
begin
     for i:=csss downto 1 do write(sss[i]);
     writeln;
     halt;
end;

begin
     read(n,m,k);
     t:=min(m-1,n-m); csss:=0; fillchar(sss,sizeof(sss),0);
     for i:=1 to t do
         b[i]:=0;
     for i:=0 to m do ccc(i,m,ck[i],cck[i]);
     for i:=0 to sqr(m)-t*m do
         ccc(i,sqr(m)-t*m,ct[i],cct[i]);

     while true do
     begin
          s:=0; csss1:=1; fillchar(sss1,sizeof(sss1),0); sss1[1]:=1;
          for i:=1 to t do
          begin
               s:=s+b[i];
               step(trunc((n-i)/m)+1,ck[b[i]],cck[b[i]],tsss,ctsss);
               multiply(sss1,csss1,tsss,ctsss,sss1,csss1);
          end;
          if k-s<=sqr(m)-t*m then begin
            step(trunc(n/m),ct[k-s],cct[k-s],tsss,ctsss);
            multiply(sss1,csss1,tsss,ctsss,sss1,csss1);
            summ(sss,csss,sss1,csss1,sss,csss);
          end;
          if k=s then begin
             p:=t;
             while (b[p]=0) and (p>0) do dec(p);
             if ((p=(k div m)) and ((k mod m)=0))
                or ((p=(k div m)+1) and ((k mod m)=b[p])) then begin
                write_result;
             end;
             b[p]:=0; dec(p);
             while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end;
             inc(b[p]);
          end
          else begin
             p:=t;
             while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end;
             if p=0 then begin
                write_result;
             end;
             inc(b[p]);
          end;
     end;
end.

А вот что оно выдает на он-лайн проверке

Тест Результат Время работы
00 FAILED (Bad Data) 0.01 сек.
01 FAILED (Bad Data) 0.01 сек.
02 FAILED (Bad Data) 0.01 сек.
03 FAILED (Bad Data) 0.01 сек.
04 FAILED (Bad Data) 0.01 сек.
05 FAILED (Bad Data) 0.01 сек.
06 FAILED (Bad Data) 0.01 сек.
07 FAILED (Bad Data) 0.01 сек.
08 FAILED (Bad Data) 0.01 сек.
09 FAILED (Bad Data) 0.01 сек.
10 FAILED (Bad Data) 0.01 сек.
11 FAILED (Bad Data) 0.01 сек.
12 FAILED (Bad Data) 0.01 сек.
13 FAILED (Bad Data) 0.01 сек.
14 FAILED (Bad Data) 0.01 сек.
15 FAILED (Bad Data) 0.01 сек.

Прошло тестов: 0 из 16.

Набрано баллов: 0 из 60.


Ваша претензия НЕОБОСНОВАНА.

Цікаво, де в програмі Bad Data, якщо в мене(на паскалі) не видає ніякої помилки і програма працює бездоганно.

Цей же код, 15 з 16 тестів:

Код:

type arr = array[1..1500] of byte;
var
   b : array[1..5] of integer;
   m, n, t, i, j, p, k, s : integer;
   tsss, sss1, sss : arr;
   ctsss, csss1, csss : integer;
   a, c : arr;
   na, nb, nc : integer;
   ck : array[0..5] of arr;
   cck : array[0..5] of integer;
   ct : array[0..25] of arr;
   cct : array[0..25] of integer;

function max(a, b : integer): integer;
begin
     if a>b then max:=a else max:=b;
end;

function min(a, b : integer): integer;
begin
     if a>b then min:=b else min:=a;
end;

procedure trans(n : longint; var c : arr; var k : integer);
begin
     k:=0;
     while n>0 do
     begin
          inc(k);
          c[k]:=n mod 10;
          n:=n div 10;
     end;
end;

procedure summ(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer);
var t,i : byte;
begin
     t:=0; k:=max(m,n);
     for i:=1 to k do
     begin
          c[i]:=a[i]+b[i]+t;
          t:=c[i] div 10;
          c[i]:=c[i] mod 10;
     end;
     if t>0 then begin
        k:=k+1; c[k]:=t;
     end;
end;

procedure multiply(a : arr; m: integer; b : arr; n : integer; var c : arr; var k : integer);
var i, j, p : integer;
    t : byte;
    cc : arr;
begin
     fillchar(c,sizeof(c),0); k:=0;
     for i:=1 to m do
     begin
       t:=0; cc[i-1]:=0;
       for j:=1 to n do
       begin
          cc[j+i-1]:=b[j]*a[i]+t;
          t:=cc[j+i-1] div 10;
          cc[j+i-1]:=cc[j+i-1] mod 10;
       end;
       if t>0 then begin p:=n+i; cc[p]:=t; end else p:=n+i-1;
       summ(c,k,cc,p,c,k);
     end;
end;

procedure step(n : integer; a : arr; m: integer; var c : arr; var k: integer);
var i, j, p : integer;
    t : byte;
    cc : arr;
begin
     fillchar(c,sizeof(c),0); c[1]:=1; k:=1;
     for i:=1 to n do multiply(c,k,a,m,c,k);
end;

procedure ccc(a, b : integer; var c : arr; var k: integer);
var  p, q : array[0..25] of longint;
     ss1, ss2 : int64;
     i, j : integer;
begin
     if a>(b div 2) then a:=b-a;
     for i:=b downto b-a+1 do
     begin
          p[b-i+1]:=i; q[b-i+1]:=b-i+1;
     end;
     for i:=a downto 1 do
     for j:=a downto 1 do
         if p[j] mod q[i]=0 then begin
            p[j]:=p[j] div q[i]; q[i]:=1;
            break;
         end;
     ss1:=1; ss2:=1;
     for i:=1 to a do
     begin
        ss1:=ss1*p[i];
        ss2:=ss2*q[i];
     end;
     ss1:=ss1 div ss2;
     trans(ss1,c,k);
end;

procedure write_result;
begin
     for i:=csss downto 1 do write(sss[i]);
     writeln;
     halt;
end;

begin
     read(n,m,k);
     t:=min(m-1,n-m); csss:=0; fillchar(sss,sizeof(sss),0);
     for i:=1 to t do
         b[i]:=0;
     for i:=0 to m do ccc(i,m,ck[i],cck[i]);
     for i:=0 to sqr(m)-t*m do
         ccc(i,sqr(m)-t*m,ct[i],cct[i]);

     while true do
     begin
          s:=0; csss1:=1; fillchar(sss1,sizeof(sss1),0); sss1[1]:=1;
          for i:=1 to t do
          begin
               s:=s+b[i];
               step(trunc((n-i)/m)+1,ck[b[i]],cck[b[i]],tsss,ctsss);
               multiply(sss1,csss1,tsss,ctsss,sss1,csss1);
          end;
          if k-s<=sqr(m)-t*m then begin
            step(trunc(n/m),ct[k-s],cct[k-s],tsss,ctsss);
            multiply(sss1,csss1,tsss,ctsss,sss1,csss1);
            summ(sss,csss,sss1,csss1,sss,csss);
          end;
          if k=s then begin
             p:=t;
             while (b[p]=0) and (p>0) do dec(p);
             if ((p=(k div m)) and ((k mod m)=0))
                or ((p=(k div m)+1) and ((k mod m)=b[p])) then begin
                write_result;
             end;
             b[p]:=0; dec(p);
             while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end;
             inc(b[p]);
          end
          else begin
             p:=t;
             while (b[p]=m) and (p>0) do begin b[p]:=0; dec(p); end;
             if p=0 then begin
                write_result;
             end;
             inc(b[p]);
          end;
     end;
end.

Питання: в чому різниця?

Поза форумом

 

#124 2008-01-11 17:38:32

RuslanSM
Новий користувач
Зареєстрований: 2006-10-20
Повідомлень: 21

Re: Барабанная дробь...

2V@ny@: Читай мої пости smile. В тому рішенні, що ти відправив ти обмежив стек в 16384. Цього недостатньо для твоєї программи. Вона вилітає за стек оверлоу.

PS:
Вивід твоєї проги на тест 5 100 12:

Runtime error 216 at 0x00401944
  0x00401944
Runtime error 216 at 0x004035FE
  0x004035FE
  0x00403B15
  0x00402E34
  0x0040246C
  0x00402AA9
  0x00403648
  0x00401944

Це не Бед Дата??

Відредаговано RuslanSM (2008-01-11 17:42:25)

Поза форумом

 

#125 2008-01-11 17:50:18

Журі_Пасіхов
Гість

Re: Барабанная дробь...

ПРИМУШУЄТЕ ГОВОРИТИ ГОЛОСНО.
В ВАРІАНТІ, ЯКИЙ ВИ ПЕРЕВІРЯЄТЕ, ВІДСУТНІ ДИРЕКТИВИ КОМПІЛЯТОРА.

А НАДІСЛАНОМУ ВАРІАНТІ ВОНИ ПРИСУТНІ.
(НЕВЖЕ ВИ НЕ ПОМІТИЛИ? ЧИ ДЛЯ ВАС ЦЕ НЕ ЦІКАВО?)

ДО ЧОГО ПРИВОДИТЬ НЕРОЗУМНЕ ВИКОРИСТАННЯ В FPC 2.0.4 ДИРЕКТИВИ М, ВАМ ВЖЕ НАМАГАЛИСЯ ПОЯСНИТИ НА ФОРУМІ.

НЕ ПОТРІБНО ШУКАТИ ВИННИХ. ПОМИЛКА ПРИКРА, АЛЕ ВАША.

МИ УВАЖНО СТАВИМСЯ ДО ЗВЕРНЕНЬ УЧАСНИКІВ, АЛЕ ПРОСИМО ЇХ БУТИ КОРРЕКНИМИ

 

Нижній колонтитул

Powered by Likt
© Copyright 2002–2009 Likt