На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Добрий день, шановне журі!
Прошу надіслати або опублікувати тести до завдання першого туру Fazenda.
Маю підозру, що неправильну відповідь отримано у результаті використання типу дійсної змінної, на який відведено більше пам'яті, ніж на тип змінної, використаний в авторському розв'язанні.
Прошу розвіяти мої сумніви.
З повагою, Ілля Ковалевський (Илья Ковалевский)
Поза форумом
Абсолютно очікувана ситуація, коли в умові задачі вимагається "виводить на екран через пропуск без заокруглення"
У нас всі учні, які писали мовою Паскаль отримали по 20 балів, а С/С++ по 8.
Погодьтесь спокійно із цим рішенням журі, і набирайте бали у наступних турах. Навряд чи 1 бал у четвертому турі буде багато важити.
Бажаю успіхів!
Поза форумом
Лично у меня на С++ прошло, возможно, благодаря использованию типа long double и вот этим двум строкам:
cout.setf(ios::scientific); cout.precision(11);
Которые задавали формат вывода научный и задавали точность немного большей, чем того было необходимо (иначе выводило бы с округлением).
Відредаговано adamant (2012-11-17 12:14:58)
Поза форумом
"без округления"="максимальная точность" (при проверке 0.000001). А господа "сишники" форматируют вывод....вот точность и пропадает....
Поза форумом
adamant написав:
Лично у меня на С++ прошло, возможно, благодаря использованию типа long double и вот этим двум строкам:
Код:
cout.setf(ios::scientific); cout.precision(11);Которые задавали формат вывода научный и задавало точность немного большей, чем того было необходимо (иначе выводило бы с округлением).
И правильно делали.
Поза форумом
tucnak написав:
Добрий день, шановне журі!
Прошу надіслати або опублікувати тести до завдання першого туру Fazenda.
За традицією олімпіад NetOI всі тести будуть (разом із розв"язками учасників та журі) доступні для завантаження ПІСЛЯ завершення олімпіади
Поза форумом
Жюри_Пасихов написав:
"без округления"="максимальная точность" (при проверке 0.000001). А господа "сишники" форматируют вывод....вот точность и пропадает....
Не зовсім так. Проблема у тому, що не було форматування виведення, як у adamant: cout.precision(11);
За замовченням у CNU C++ точність виведення нижче, ніж вимагали Ви.
Але прохання до Юрія Яковича. Не сприймайте, мої повідомлення, як критику. Я просто хочу допомогти
олімпіадникам зрозуміти, де їх можуть чекати "підводні камені".
Дуже вдячний за задачі першого туру - дуже корисні!
З повагою, Alex_Bulany.
Поза форумом
Шановне журі!
За традицією олімпіад NetOI всі тести будуть (разом із розв'язками учасників та журі) доступні для завантаження після завершення олімпіади. Зауважте: це суперечить традиціям проведення IV етапу олімпіади, на якому цю інформацію повідомляють після туру (можливо, крім власне кодів програм членів журі). А призом NetOI є саме участь у IV етапі...
Відсутність процедури апеляції при проведенні NetOI не означає, що таку інформацію (зміст тестів) неможна поширювати.
Маю підозру, що не в одного учасника, що використовував мову програмування C, знято бали за надлишкову точність у задачі FAZENDA. Зміст тестів потрібно "розкрити" хоча б для того, щоб учасники змогли з'ясувати причину санкцій й уникнули у майбутньому аналогічних ситуацій. Обчислення можна провести з довільною точністю, використовуючи, наприклад, Reduce.
Зростання рівня кваліфікації учасників - це найголовніше завдання NetOI. І щоб виконати це завдання, тестові файли потрібно опублікувати.
Поза форумом
Традиції IV eтапу у різний час різні... на моїй пам'яті бувало й так, що тести залишалися недоступними для учасників взагалі. NetOI - довготремінова олімпіада, і дійсно має навчальну мету. Але навчання навряд чи зводиться до "латання" власного розв"язку "під комплект" тих чи інших тестів. Та й он-лайн перевірка існує і постійно доступна. Виправляйте помилки, доводьте до повного балу. Що стосується задачі FAZENDA, то бали "зняті" не за надлишкову, а за НЕДОСТАТНЮ точність. Наведу фрагмент перевіряючого модуля (Python, сішник код зрозуміє, якщо й мова не знайома), із якого все очевидно. А тести вам зараз ні до чого...
eps = 0.00001
def check(self, dat, chk, sol):
if (abs(sol.result[0] - chk.result[0]) > self.eps)or(abs(sol.result[1] - chk.result[1]) > self.eps):
self.break_WA()
self.break_OK()
Поза форумом
tucnak написав:
Зростання рівня кваліфікації учасників - це найголовніше завдання NetOI.
Шановний Ілля!
Я згоден з Вами.
Які висновки можна зробити з тієї ситуації?
По- перше, коли автори задачі не вказують точності відповіді - це зона ризику для Вас.
Якщо це відбувається на очній олімпіаді, то обов'язково потрібно ставити запитання.
Якщо відповіді немає, то потрібно розбиратися самому. За правилами, у системі перевірки використовуються два компілятори.
У FreePascal типи real,double виводяться з 15 значащими цифрами, а extended з 17.
У GNU C всі типи (float, double, long double) виводяться по замовченню з 6 значащими цифрами, і тому щонайменше 20 учасників отримали по 8 балів або нижче.
Тому, працюючі у С/С++ виведення потрібно форматувати до рівня Pascal. Наприклад, << setprecision(15).
Розв'язок "без заокруглення" отримує 8 балів,
з заокругленням << setprecision(7) - 17 балів, << setprecision(8) 19 балів, якщо більше, то повний бал.
Але гарантію Вам може дати тільки << setprecision(15)
Бажаю, що б у подальшому, Ваш досвід дав би Вам великі прибуткі. І ціна, яку Ви заплатили сьогодні, не така вже й велика.
Бажаю успіхів.
Поза форумом
Alex_Bulany написав:
За замовченням у CNU C++ точність виведення нижче, ніж вимагали Ви.
З повагою, Alex_Bulany.
Так. І це зроблено свідомо. Єдине, за що сам себе критикую - це те, що в умові не сказав традиційного для нас "результат виводьте із максимально можливою точністю", саме так ми писали завжди в технічних умовах до задач з дійсною відповіддю. На мій погляд, вимога типу "із такою-то точністю" породжує бажання розв"язувати задачу інколи ... на з того боку. Дякую вам за корисні коментарі і зауваження.
Поза форумом
Жюри_Пасихов написав:
Alex_Bulany написав:
За замовченням у CNU C++ точність виведення нижче, ніж вимагали Ви.
З повагою, Alex_Bulany.Так. І це зроблено свідомо. Єдине, за що сам себе критикую - це те, що в умові не сказав традиційного для нас "результат виводьте із максимально можливою точністю", саме так ми писали завжди в технічних умовах до задач з дійсною відповіддю. На мій погляд, вимога типу "із такою-то точністю" породжує бажання розв"язувати задачу інколи ... на з того боку. Дякую вам за корисні коментарі і зауваження.
Особисто мені здається, що учасник олімпіади менше має звертати уваги на особливості виводу відповіді, аніж на спосіб знаходження цієї відповіді.
Поза форумом
IskanderUA написав:
Жюри_Пасихов написав:
Alex_Bulany написав:
За замовченням у CNU C++ точність виведення нижче, ніж вимагали Ви.
З повагою, Alex_Bulany.Так. І це зроблено свідомо. Єдине, за що сам себе критикую - це те, що в умові не сказав традиційного для нас "результат виводьте із максимально можливою точністю", саме так ми писали завжди в технічних умовах до задач з дійсною відповіддю. На мій погляд, вимога типу "із такою-то точністю" породжує бажання розв"язувати задачу інколи ... на з того боку. Дякую вам за корисні коментарі і зауваження.
Особисто мені здається, що учасник олімпіади менше має звертати уваги на особливості виводу відповіді, аніж на спосіб знаходження цієї відповіді.
Тим паче, мені не зрозуміло чому в умові задачі не було вказано точність, потрібну для виводу результату. Цитую технічні умови:
Програма Fazenda читає з клавіатури через пропуск висоти трикутника - дійсні числа h1, h2, h3 (1<=h1, h2, h3<=10000) та виводить на екран через пропуск без заокруглення площу і периметр трикутника. Якщо трикутника не існує, вивести через пропуск двічі 0.
1. printf("%E %E\n", s, p); - послідовно виводить через прогалину два числа типу double без заокруглення (що відповідає умові задачі)
2. printf("%.10E %.10E\n", s, p); - виконує ті самі дії, що й код з п.1, проте з точністю 10 знаків після коми.
Другий варіант проходить усі тести (на відміну від першого), проте в умові задачі явно не вказано, що потрібно виводити з максимальною точністю чисел. Також не було сказано, що максимальна точність це > 6 знаків після коми.
Прошу вказати на помилкову ланку в логічному ланцюжці моїх роздумів.
З повагою, Ковалевський Ілля.
Поза форумом
Помилкова ланка в тому, що
1. printf("%E %E\n", s, p); - послідовно виводить через прогалину два числа типу double без заокруглення (що відповідає умові задачі)
Ця команда насправді заокруглює число до 6 знаків, за що ви і недобираєте 12 балів.
Поза форумом
Жюри_Непомнящий написав:
Помилкова ланка в тому, що
1. printf("%E %E\n", s, p); - послідовно виводить через прогалину два числа типу double без заокруглення (що відповідає умові задачі)
Ця команда насправді заокруглює число до 6 знаків, за що ви і недобираєте 12 балів.
Пане Непомнящий, красно дякую за швидку відповідь!
В такому разі мені не зрозуміло, чому в умові задачі не було сказано нічого про потрібну "точність" виводу. В розрізі використаної мною мови програмування, округлення до 11 знаків після коми - також заокруглення. В даному випадку, ті учасники олімпіади, що округлили на більше число - отримали більше балів?
Таким чином, вказані мною розв'язки:
1. printf("%E %E\n", s, p);
2. printf("%.10E %.10E\n", s, p);
однаково порушують умову задачі (..прогалину два числа без заокруглення..), а зокрема - технічні умови. Проте розв'язок №2 - проходить 100% тестів, що не можна сказати про розв'язок №1.
З повагою, Ілля Ковалевський.
Відредаговано tucnak (2012-11-17 22:47:04)
Поза форумом
Дискусія пішла по другому колу. Позиції, здається, зрозумілі. Журі приносить вибачення за те, що в технічних умовах замість слів "з максимально можливою точністю" були слова "без заокруглення". Відсутність уточнюючих питань під час 3 тижнів туру давала нам можливість вважати, що в умові все зрозуміло. Учасники, що прикро втратили бали на цій, насправді дуже простій задачі, вважають, що їх ввели в оману, вони нічого не заокруглювали, заокруглював компілятор, а вони просто обрали формат виведення, що заокруглює "грубіше", ніж інші....Таких "постраждалих" - 17 , роз'вязків на С/С++ більше 60, у решти проблеми не виникли. Вони зрозуміли, що "не заокруглювати результат при виведенні " означає вивести максимальну можливу для даного компілятора (і, зрозуміло, машинного представлення) кількість вірних знаків після коми...
Провести повторну перевірку з меньшою точністю - не питання, але чи справедливо це буде по відношенню до тих, хто "запропонував" роботу більш точну відповідь?
Поза форумом
IskanderUA написав:
Особисто мені здається, що учасник олімпіади менше має звертати уваги на особливості виводу відповіді, аніж на спосіб знаходження цієї відповіді.
Згоден на 100%. Тим більше, що така точність, яка вимагається в задачі є абсурдною з фізичної точки зору, бо це вже розміри квантової фізики.
Єдине, що виправдовує такий підхід - це особливості конкретної системи автоматизованої перевірки результатів обчислень (в чому я мало розуміюсь).
Жюри_Пасихов написав:
Журі приносить вибачення... Відсутність уточнюючих питань під час 3 тижнів туру давала нам можливість вважати, що в умові все зрозуміло...
"Відсутність уточнюючих питань"???
Та була ціла дискусія з цього приводу, в якій автор задачі, здається, участі не приймав.
Цитую деякі уривки з гілки Fazenda:
Cz написав:
Що означає виводити відповіді без заокруглення?
Яка максимальна кількість знаків має відображатись, якщо число - нескінченний дріб?
Чи обов'язково відповіді мають бути в експоненційній формі?
LVV написав:
У мене замість авторського
6.0000000000Е+02 1.2000000000Е+02
виводить 600 120 та тест все одно пройшов нормально. Хоч питання Cz мене теж цікавлять.
mariyka_mariyka написав:
...маю відповідь 6.0000000000000Е+002 1.2000000000000Е+002
тести не проходять... будь ласка, підкажіть, що я роблю не так?...
LVV написав:
Вопрос не в том, как вывести экспоненциальную (научную, стандртную) запись числа с определённым количеством десятичных знаков... Вопрос в том, принципиально ли это для данной задачи, или нет?....
mariyka_mariyka написав:
здається, проблема в тому, що 6.0000000000000Е+002 це не авторське 6.0000000000Е+02
victor18 написав:
В умові сказано, виводити числа без заокруглення. В авторському прикладі числа цілі, тому відповіді 600 120, 600.000 120, 6.0000000000Е+02 1.2000000000Е+02, 6.0000000000000Е+002 1.2000000000000Е+002 рівносильні і повинні проходити онлайн-перевірку. Я маю на увазі, що може помилка в чомусь іншому.
Проводити, чи не проводити повторну перевірку - це на розсуд журі. А от якось зобов'язати авторів задач офіційно відповідати на питання учсників стосовно умови задачі було б непогано.
Відредаговано LVV (2012-11-18 08:18:58)
Поза форумом
Вони зрозуміли, що "не заокруглювати результат при виведенні " означає вивести максимальну можливу для даного компілятора (і, зрозуміло, машинного представлення) кількість вірних знаків після коми...
Одні зрозуміли, інші не зрозуміли. Це, як мінімум не серйозно.
Провести повторну перевірку з меньшою точністю - не питання, але чи справедливо це буде по відношенню до тих, хто "запропонував" роботу більш точну відповідь?
Повторюся. Як я писав раніше - "заокруглити до 11 знаків після коми - також заокруглити". Умова була однаково "неточна" по відношенню до усіх учасників олімпіади. І ще раз повторюся, більше балів отримали ті, кто "згогадався запропонувати" перевіряючій машині більш точну відповідь. В даному випадку ми маємо, як мінімум, неточну умову, та здогадки 43 учасників олімпіади. Тому, я думаю, що таки треба провести повторну перевірку з меншою точністю. А що вирішить робити журі, це, як кажуть, вже їх справа.
З повагою, Ковалевський Ілля!
Поза форумом
Lorderot написав:
tucnak написав:
Тому, я думаю, що таки треба провести повторну перевірку з меншою точністю. !
Це буде некоректно по відношеню тих хто зрозуміли.
Так буває, коли умова сформульована не зовсім точно. Тоді у частини учасників хід думок співпадає з ходом думок автора, а у частини - ні, і, відповідно, хтось залишається ображеним. Або ті, хто вірно розв'язали задачу, яку самі придумали, бо не зрозуміли автора, або, якщо першим зарахують розв'язки, ораженими будуть ті екстрасенси, які зрозуміли автора. У більшості ж випадків з цією задачею, взагалі, співпав навіть не хід думок, а мова, якою писався розв'язок.
Все-таки, варто було б чітко написати, з якою точністю має бути виведена відповідь. Бо "без заокруглення", та й навіть "з максимально можливою точністю" може мати купу різних інтерпретацій. Як писали вище, у С++, наприклад long double може і 18 знаків після крапки зберігати. А от до фрази "з точністю 6, 9, 12(потрібне підкреслити) знаків після коми" причепитися буде важко.
Але тут питання чисто символічне. Ці 12 балів все одно нікого не врятують. У 4 турі вони стануть 1 балом, а для виходу в четвертий їх можна буде без проблем "відбити" у наступних двох турах. Там, на щастя, розігрується 500 балів, тож "назбирати" 12 буде нескладно.
Відредаговано Dim_ov (2012-11-18 15:01:30)
Поза форумом
Прийнято таке рішення: Повторної перевірки не проводити. Але якщо комусь із "8-бальних фазендників" не буде вистачати до виходу ц фінал <=12 балів, до фіналу їх допустити.
Все - тему закрито.
Поза форумом