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


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

Ви не зайшли.

#1 2011-11-22 21:38:50

shadybaby
Новий користувач
Зареєстрований: 2011-11-22
Повідомлень: 3

Допоможіть, будь ласка..

Ось мої рішення задач,
але їх зовсім) не прийняла система
а я невзмозі знайти ,що саме не так
допоможіть знайти помилки.

Program Сalculation;
           var a2,x2,a3,a4,a5,a6,a7,a8,a9,a,b,l2,v,i,v2,v3,v4,v5,v6,v7,v8,v9,x3,x4,x5,x6,x7,x8,x9,l3,l4,l5,l6,l7,l8,l9:integer;
           begin
           read(a,b);
           a2:=a;a3:=a;a4:=a;a5:=a;a6:=a;a7:=a;a8:=a;a9:=a;
           v2:=1;x2:=0;
           while a2>0 do begin
           l2:=a2 mod 2; a2:=a2 div 2;x2:=x2+l2*v2; v2:=v2*10; end;
           
          v3:=1;x3:=0;
           while a3>0 do begin
           l3:=a3 mod 3; a3:=a3 div 3;x3:=x3+l3*v3; v3:=v3*10; end;
           
           v4:=1;x4:=0;
           while a4>0 do begin
           l4:=a4 mod 4; a4:=a4 div 4;x4:=x4+l4*v4; v4:=v4*10; end;
           
           v5:=1;x5:=0;
           while a5>0 do begin
           l5:=a5 mod 5; a5:=a5 div 5;x5:=x5+l5*v5; v5:=v5*10; end;
           
           v6:=1;x6:=0;
           while a6>0 do begin
           l6:=a6 mod 6; a6:=a6 div 6;x6:=x6+l6*v6; v6:=v6*10; end;

           v7:=1;x7:=0;
           while a7>0 do begin
           l7:=a7 mod 7; a7:=a7 div 7;x7:=x7+l7*v7; v7:=v7*10; end;
           
           v8:=1;x8:=0;
           while a8>0 do begin
           l8:=a8 mod 8; a8:=a8 div 8;x8:=x8+l8*v8; v8:=v8*10; end;
           
           v9:=1;x9:=0;
           while a9>0 do begin
           l9:=a9 mod 9; a9:=a9 div 9;x9:=x9+l9*v9; v9:=v9*10; end;

            if b=x2 then write(2);
            if b=x3 then write(3);
            if b=x4 then write(4);
            if b=x5 then write(5);
            if b=x6 then write(6);
            if b=x7 then write(7);
            if b=x8 then write(8);
            if b=x9 then write(9);
                                   end.



  Program Figurå;
                  var N,z,j,k,i:integer; m,l:array[1..1000000] of integer;
         begin
    read(N);
    for i:=1 to N do
    read(m[i],l[i]);
                       z:=0;     k:=1;
    for i:=1 to N do
    begin
   for j:=i+1 to N do begin
if (m[i]=m[j]) and (l[i]=l[j])   then k:=k+1; end;
    if k>z then begin z:=k;end; k:=1;
                        end;
                             writeln(z);
                                    end.

Поза форумом

 

#2 2011-11-23 04:37:24

LVV
Олімпієць
Звідки: Цюрупинськ
Зареєстрований: 2010-11-19
Повідомлень: 294
Вебсайт

Re: Допоможіть, будь ласка..

А так не пробовали:

Program Figure;
                  var N,z,j,k,i:integer; m,l:array[1..10000] of integer;
..........................................


Зачем Вам миллионные массивы?
Козда можно создать двумерный массив (типа long int) по количеству клеток на шахматной доске 8 х 8 (или даже одномерный можно на 64 элемента), обнулить его и добавлять в цикле по единичке в каждую ячейку с индексами, соответствующими считанной паре координат.
Потом только останется найти максимальный элемент такого массива.

Відредаговано LVV (2011-11-23 04:59:10)

Поза форумом

 

#3 2011-11-23 11:16:46

Ilya Porublyov
журі
Зареєстрований: 2005-10-27
Повідомлень: 130

Re: Допоможіть, будь ласка..

Спробую відповісти сАме на питання "що не так конкретно тут", а не на питання "як можна іще".

Конкретно з програмою Program Figurå;
Я не знаю, яка буква була в імені з самого початку, але букви "å" там точно не треба.

ЯКЩО з кодом задачі (який виставляється автоматично згідно імені програми, але потім можна змінити) все гаразд, то результати перевірки такі:

00    PASSED (+0)    0.01 сек.
01    PASSED (+1)    0.01 сек.
02    PASSED (+1)    0.01 сек.
03    PASSED (+1)    0.01 сек.
04    PASSED (+1)    0.01 сек.
05    PASSED (+1)    0.01 сек.
06    PASSED (+1)    0.01 сек.
07    PASSED (+1)    0.01 сек.
08    PASSED (+1)    0.01 сек.
09    PASSED (+1)    0.01 сек.
10    PASSED (+1)    0.01 сек.
11    PASSED (+1)    0.01 сек.
12    FAILED (Time Out)    0.06 сек.
13    FAILED (Bad Data)    0.08 сек.
14    FAILED (Bad Data)    0.16 сек.
15    FAILED (Bad Data)    0.28 сек.
16    FAILED (Bad Data)    3.04 сек.
17    PASSED (+1)    0.43 сек.
18    FAILED (Bad Data)    0.14 сек.
19    FAILED (Bad Data)    0.24 сек.
20    FAILED (Bad Data)    3.03 сек.


Конкретно Bad Data спричинено, найімовірніше, тим, що тип integer у Free Pascal 16-бітовий, тобто до 32767, і використання його для індексів масивів більших розмірів призводить до різноманітних наслідків. Щоправда, конкретно тут виправлення integer на longint не дає жодного нового пройденого тесту, лише Bad Data міняються на Time Out (програма працювала занадто довго й була зупинена примусово). Тут треба просто робити принципово інший алгоритм. Наприклад, такий, як описав (словами) LVV. А от смисл пропозиції LVV тупо скоротити розмір масива до 10000 абсолютно не зрозумілий: якщо неоптимальний алгоритм передбачає, що всі дані слід прочитати у масив, то в такій програмі розмір масиву таки повинен бути мільйонним.

Поза форумом

 

#4 2011-11-23 13:32:27

LVV
Олімпієць
Звідки: Цюрупинськ
Зареєстрований: 2010-11-19
Повідомлень: 294
Вебсайт

Re: Допоможіть, будь ласка..

Ilya Porublyov написав:

А от смисл пропозиції LVV тупо скоротити розмір масива до 10000 абсолютно не зрозумілий: якщо неоптимальний алгоритм передбачає, що всі дані слід прочитати у масив, то в такій програмі розмір масиву таки повинен бути мільйонним.

sad

Зміст моєї пропозиції був не в тому, щоб "тупо скоротити розмір масива до 10000", а в тому, щоб учень сам здогадався, чому при 1000000 не працює (а воно таки не працює) а при 10000 працює smile і зрозумів, що потрібен інший підхід, якщо не можна навіть визначити масив потрібного (за його алгоритмом) розміру.

Відредаговано LVV (2011-11-23 13:39:56)

Поза форумом

 

#5 2011-11-23 15:35:13

LVV
Олімпієць
Звідки: Цюрупинськ
Зареєстрований: 2010-11-19
Повідомлень: 294
Вебсайт

Re: Допоможіть, будь ласка..

shadybaby написав:

допоможіть знайти помилки.

Program Сalculation;

Ну, по-перше, переповнення відбувається, коли перевірити на значеннях, наприклад  131072 та 100000000000000000,
а по-друге, я не впевнений, що перевіряюча система прийме перехід на новий рядок при виводі результату writeln(z) (краще write(z)), бо на C++, наприклад, зайвий перехід на новий рядок видає як технічну помилку.

Поза форумом

 

#6 2011-11-23 16:28:39

shadybaby
Новий користувач
Зареєстрований: 2011-11-22
Повідомлень: 3

Re: Допоможіть, будь ласка..

Дякую вам.

не підкажите, що треба зробити, щоб переповнення не відбувалося для 131072 та 100000000000000000
вибачте за такі питання,я початківець
хотілося б зрозуміти

Поза форумом

 

#7 2011-11-23 17:52:52

LVV
Олімпієць
Звідки: Цюрупинськ
Зареєстрований: 2010-11-19
Повідомлень: 294
Вебсайт

Re: Допоможіть, будь ласка..

Доречі, здається у Ваших кодах помилка не лише в назві Figurå, а й в назві Сalculation;(перший символ), бо при збереженні коду в unicod замість символу "С" висвічується щось дивне.

А стосовно переповнення, нажаль я не орієнтуюсь у типах даних середовища TurboPascal (чи є там щось більше за цілочисленний тип longint) чи як там можна це обійти.... (думаю, тут знайдуться спеціалісти, які підкажуть, як бути).

А у С++ ця проблема вирішується використанням типу даних long long int.

Хоча е й інші методи зчитування й збереження дуже великих чисел, які неможливо зберегти в жодному типові змінних.

Відредаговано LVV (2011-11-24 11:20:01)

Поза форумом

 

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

Powered by Likt
© Copyright 2002–2009 Likt