На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Уважаемое Жури!
К сожалению имеет место слудующая ситуация.
В условии задачи Pool не указан точно формат вывода.
На форуме в теме "Задача Pool" даже задавался вопрос насчет формы вывода:
Джулгаков Дмитрий написав:
Хорошо, в таком случае как выводить ответ средствами C? printf("%le",.....); подойдет? по умолчанию знаков выводится меньше чем в примере, но онлайн проверку проходит...
Этот вопрос, к сожалению, не получил официального ответа.
Но после тестирования оказалось, что при выводи в C++ ответа с помощью
printf("%le\n",res);
программа набирает 13 балов.
Та же программа, но с выводом в другом формате:
printf("%lf\n",res);
Набирает 20 балов.
Оба эти формата вывода являются способами по умолчанию в С++.
Почему балы учасников зависят от того, угадали ли они, какой способ надо использовать, чтобы получить полный бал?
Просьба рассмотреть эту ситуацию и, по возможности, исправить систему тестирования, чтобы она признавала правильным оба способа вывода.
Заранее спасибо.
Поза форумом
Полностью согласен с reiten. В условии сказано, что необходимо выводить ответ без форматирования, стандартным образом. Для языка С в фукнции printf стандартными являются как "%lf" так и "%le". Более того, в тестовом примере сделан вывод в экспоненцальном формате, что достигается в С именно "%le". Собственно, что касается меня, то я всегда делал вывод в виде "%lf", изза именно тестового примера я сделал вывод в виде "%le".
Прошу жюри рассмотреть этот вопрос, потому что такая неопределенность влечет за собой неравноправие языков программирования. Замечу, что проблема именно в выводе, поскольку с точностью все нормально, я использовал тип double.
Насколько мне известно, кроме меня и Даниила Нейтера, такая проблема возникла и у Николая Тимченко. Хотя в целом, похоже все 13 баллов по задаче pool с решениями на языке С вызваны этой проблемой.
Заранее благодарен.
P.S. На мой взгляд, жюри должно наоборот с большей внимательностью относиться к участниками, пишущим на С. Поскольку с этого года на межнаре поддерживается только linux, а под ним программирование на Паскале связано с определенными трудностями...
Відредаговано Джулгаков Дмитрий (2006-10-28 11:56:59)
Поза форумом
reiten написав:
Уважаемое Жури!
К сожалению имеет место слудующая ситуация.
В условии задачи Pool не указан точно формат вывода.
На форуме в теме "Задача Pool" даже задавался вопрос насчет формы вывода:Джулгаков Дмитрий написав:
Хорошо, в таком случае как выводить ответ средствами C? printf("%le",.....); подойдет? по умолчанию знаков выводится меньше чем в примере, но онлайн проверку проходит...
Этот вопрос, к сожалению, не получил официального ответа.
Но после тестирования оказалось, что при выводи в C++ ответа с помощьюКод:
printf("%le\n",res);программа набирает 13 балов.
Та же программа, но с выводом в другом формате:Код:
printf("%lf\n",res);Набирает 20 балов.
Оба эти формата вывода являются способами по умолчанию в С++.
Почему балы учасников зависят от того, угадали ли они, какой способ надо использовать, чтобы получить полный бал?
Просьба рассмотреть эту ситуацию и, по возможности, исправить систему тестирования, чтобы она признавала правильным оба способа вывода.
Заранее спасибо.
Ошибки тестирования нет. Система корректно обрабатывает результат в ЛЮБОМ из используемых в языках программирования форматов ( подтверждением того- часть тестов ваше решение проходит, значит формат понимается системой правильно). Алгоритм проверки очевиден из фрагмента проверяющего модуля (Python)
eps = 0.00001
def check(self, dat, chk, sol):
if sol.result==[]:
self.break_BD()
if (abs(sol.result[0] - chk.result[0]) > self.eps):
self.break_WA()
self.break_OK()
В условии задачи предлагалось выводить результат, не округляя. Мы полагали, что этого достаточно, дабы участник понимал, что вывести его нужно как можно точнее. Значение констаты eps выбрано таким, чтобы участник, использующий любой разрешенный олимпиадой компилятор, мог ее достичь.
Тереь по поводу "неответов" на вопрос Дмитрия. Нельзя лишать себя точности (которая, кстати "ничего не стоит" в этой задаче) лишь только потому, что более грубый результат проходит он-лайн проверку на авторском тесте. Там числа так подобраны специально.
Единственное, с чем можно частично согласится - это отсутствие в условии слов "как можно точнее". Хотя еще раз скажу, мне казалось это очевидным.
Неравноправного отношеия к языкам программирования я тут ни коим образом не усматриваю.
Поза форумом
Журі NetOI-2006-Пасіхов
Известно,что точность обоих вариантов вывода зависит от умолчаний системы, где компилируется программа. Таким образом я как учасник не могу предсказать, какая из форм вывода выдаст большую точность. Нигде в правилах или условиях этого не сказано, как и не сказано, каким именно способом выводить действительные числа. На форуме, как я уже писал, задавался вопрос. Ответа на этот вопрос не последовало вообще. Но после появления результатов олимпиады оказалось, что проходит только 1 из способов вывода ответа.
Неравноправие языков состоит в том, что в паскале есть только 1 стандартный способ вывода, который принимается как правильный.
Никто точности себя решал. Моя программа, которую я сдал выводит ответ не округляя и выполняет все положение правил и условий:
#include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define SQR(x) ((x)*(x)) #define DISTANCE(x1,y1,x2,y2) sqrt(SQR((x1)-(x2))+SQR((y1)-(y2))) int main() { double xmax,ymax,x1,y1,x2,y2; double res=1e100; // freopen("pool.in","r",stdin); scanf("%lf%lf%lf%lf%lf%lf",&xmax,&ymax,&x1,&y1,&x2,&y2); res=min(res,DISTANCE(x1,y1,x2,-y2)); res=min(res,DISTANCE(x1,y1,-x2,y2)); res=min(res,DISTANCE(x1,y1,x2,2*ymax-y2)); res=min(res,DISTANCE(x1,y1,2*xmax-x2,y2)); printf("%le\n",res); return 0; }
Если же в этой же программе поменять метод вывода на %lf, то она благополучно проходит все тесты из условия:
#include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define SQR(x) ((x)*(x)) #define DISTANCE(x1,y1,x2,y2) sqrt(SQR((x1)-(x2))+SQR((y1)-(y2))) int main() { double xmax,ymax,x1,y1,x2,y2; double res=1e100; // freopen("pool.in","r",stdin); scanf("%lf%lf%lf%lf%lf%lf",&xmax,&ymax,&x1,&y1,&x2,&y2); res=min(res,DISTANCE(x1,y1,x2,-y2)); res=min(res,DISTANCE(x1,y1,-x2,y2)); res=min(res,DISTANCE(x1,y1,x2,2*ymax-y2)); res=min(res,DISTANCE(x1,y1,2*xmax-x2,y2)); printf("%lf\n",res); return 0; }
Оба варианта - абсолютно правильные решения и полностью выволняют все положения и условия олимпиады. Почему решение, выполнившее все условия олимпиады получает только часть балов? Просьба принять какие-то меры относительно этой проблемы. Заранее спасибо.
Даниил Нейтер.
Поза форумом
Еще более неприятная обстановка складывается в случае использования стандартного ввода/вывода C++ через cout. В этом случае для достижения точности, которая требуется для прохождения всех тестов, необходимо использовать НЕ СТАНДАРТНЫЙ способ, заключающийся в изменении формата вывода с помощью cout.precision(число знаков), в отличие от Си, где и %lf и %le являются стандартными.
Поза форумом
По-моему, дискуссия носит "турнирный" характер. Задачи, право, того не стоят.
1.Не оценены тесты, в которых результат менее точен, чем авторский. (см. выше сообщение)
2. ВО ВСЕХ компиляторах нужная точность достижима (проверял)
3. Настройки среды по умолчанию (?) - в правилах указан тип используемого компилятора и стандврт, с которым должны быть совместимы решения. Использование иных настроек в правилах не оговаривалось и НЕ ПРОИЗВОДИЛОСЬ.
Цитирую правила:
Для трансляцiї програм на мовах C и C++ використовується компiлятор GNU Compiler Collection 3.3.2. Версiї для MS DOS та MS Windows можна взяти на серверах http://www.delorie.com та http://www.mingw.org , для iнших систем його можна отримати на http://gcc.gnu.org.
При компiляцiї програм, написаних на C та C++ використовується режим повної сумiсностi з стандартом ANSI.Програма збирається разом з математичною бiблiотекою.
Ви можете користуватись iншими компiляторами, але врахуйте, що GNU C не пiдтримує їх розширень, якi виходять за стандарт мови.
4. Оказалось, что "вывести не округляя" участники не восприняли как "максимально точно" .Готов согласитья, не совсем одно и то же.... но я был уверен, что подразумевается... В любом случае учтем на будущее, а пока все были в одинаковых условиях. Прямых вопросов по точности не было. Были вопросы типа "Как в С выводить - так или так?" - мы на такие вопросы не отвечаем - работаешь со средой - должен ее знать, не знаешь- работай в том, что знаешь (позиция принципиальная).
Поза форумом
reiten написав:
...Но после появления результатов олимпиады оказалось, что проходит только 1 из способов вывода ответа.
Неравноправие языков состоит в том, что в паскале есть только 1 стандартный способ вывода, который принимается как правильный...
Способов вывести далеко не 1 и не два в обоих языках(да и что считать стандартным)
А в условии про "стандарт" ничего не говорилось, сказано было не округляя.
В прошлом году в условии было что-то подобное... И на вопрос сколько знаков выводить, Жюри ответило "в скольки уверен"(не дословно, а по памяти, если что - сорри...).
Я тоже не знал как выводить... Но ведь у нас есть он лайн тестилка
Я например, на проверке онлайн проверил что достаточно до пятого знака, но все равно выводил десять знаков после точки. Логика предельно проста, если онлайн тесты проходит, то зачем урезать знаки? От того что выведу больше хуже не будет
cout.setf(ios::fixed);cout.precision(10); cout<<ANS<<endl;
Відредаговано alex_kasycky (2006-10-28 20:19:48)
Поза форумом
Чёрт, та же беда - я по старой привычке экономить память переменные single`м обозвал... Блин, ну надо же было точность то в условии написать! Ладно, ладно, действительно - не та эта задача за которую нужно спорить - это моя ошибка
_____
add.
Блииииииин... На задаче area - вообще какая то ошибка идиотская - вместо integer byte написал... И все - так - все идеально решенная задача.. Всё - надо теперь решать днем а не ночью..
Відредаговано Jura (2006-10-28 21:26:46)
Поза форумом
после добавления cout.precision(20); моя программа набрала при онлайн-тестировании 19 баллов, вместо 10и полученных... :'( неужели фраза "не округляя" означает то, что результат должен содержать полностью мантиссу числа?
Поза форумом
Знаете ли господа товариши. Не при детях будет сказано но так СРАТСЯ за семь балов которые в итоге зуб даю ничего не решат все равно. Да и ваще сишникам месть за стл. Паскаль форева - ну это конечно шутки, но пора и честь знать. Все равно если даже будет у вас 100 - всеравно на перво месте не будете, а если не будет 100 балов - тоже корона не спадет...
Поза форумом
necro написав:
Знаете ли господа товариши. Не при детях будет сказано но так СРАТСЯ за семь балов которые в итоге зуб даю ничего не решат все равно. Да и ваще сишникам месть за стл. Паскаль форева - ну это конечно шутки, но пора и честь знать. Все равно если даже будет у вас 100 - всеравно на перво месте не будете, а если не будет 100 балов - тоже корона не спадет...
знаешь, Товарищ... не при детях будет сказано, но так СРАТЬСЯ из-за нашего желания получить эти 7 баллов это, на мой взгляд, никак не может быть следствием знания чести. и что тут говорить о великой цели быть 1ым? я не стану закрывать глаза даже на один бал, даже находясь на последнем месте… таковы принципы…
Поза форумом
necro написав:
Знаете ли господа товариши. Не при детях будет сказано но так СРАТСЯ за семь балов которые в итоге зуб даю ничего не решат все равно. Да и ваще сишникам месть за стл. Паскаль форева - ну это конечно шутки, но пора и честь знать. Все равно если даже будет у вас 100 - всеравно на перво месте не будете, а если не будет 100 балов - тоже корона не спадет...
Месть за СТЛ... СРАТЬСЯ за семь баллов... Насмешил. По-моему, ты слегка не уловил смысл этой дискуссии. Перечитай еще раз посты Reitena и Джулгакова Дмитрия и обмозгуй прочитанное
Поза форумом
alex_kasycky написав:
Я тоже не знал как выводить... Но ведь у нас есть он лайн тестилка
Загвоздочка... Оба варианта кода на C проходили онлайн-проверку
Поза форумом
Nicky Nick написав:
alex_kasycky написав:
Я тоже не знал как выводить... Но ведь у нас есть он лайн тестилка
Загвоздочка... Оба варианта кода на C проходили онлайн-проверку
Я это написал, прочитай мой пост внимательней
Поза форумом
Шановні ЖУРІ!!! В умові задачі на тесті ДАНИЙ ПРИКЛАД ВИХІДНИХ ДАНИХ : 8.94427190999159Е+000. Звідки слідує, що дані потрібно виводити у експотенціальній формі, тобто на С++ це буде так:
cout.setf(ios::scientific);
cout<<res;
НА С так:
printf("%le\n",res);
Тобто у прикладі ви даєте один формат даних, при тестуванні на повному наборі тестів ви даєте інший формат вихідних даних. ТОМУ ВИ ОБ'ЯЗАНІ ПЕРЕПРОВІРИТИ РІШЕННЯ УСІХ УЧАСНИКІВ НА ЦІЙ ЗАДАЧІ використовуючи два формата вихідних даних.
Поза форумом
2Evgeniy : "Об'язані" говоришь
2NickyNick : Это ты перечитай мой посто а не выдирай цитаты которые без самого поста имеют не тот смысл. Я написал что это шутка. А я то и имел ввиду что овчинка выделки не стоит. Ну даже если жюри допустило ошибку в системе проверки (что сомнительно) всеравно семь баллов... Жюри уже про второй тур думать должно а вы первый никак не отпустите... Не так много человек в жюри что бы их так доставать...
2xXx : Сраные ваши принципы...
Поза форумом
Мы не занимаемся дракой за "лишние семь баллов", мы прикладываем усилия к улучшению олимпиады NetOI, к уточнению формулировок, используемых в правилах и условиях. "Не округляя" сложно воспринять иначе как "не предпринимая никаких дополнительных действий по округлению". Кому-либо за что-то мстить глупо, не говоря уж о том, что СТЛ - не случайный элемент, который (о ужас!) появился не в великолепном, академическом Паскале, а в языке для тупых ремесленников C++, а закономерное следствие стройности и ортогональности синтаксиса серьезного профессионального языка, и задач, которые стоят перед C++-программистами. Кроме того, Паскаль никак не может быть "форева", поскольку его, наконец-то, начали запрещать на соревнованиях по программированию всех уровней.
Поза форумом
Круто! Старый друг Паскаль меня не подвел!!! Нету там никаких проблем с выводом - загнал экстендыд и все ок, 20/20 балов! Так что жури тоже молодец. Надо же дискридитировать не только Паскаль, а и Си(хоть изредка). Ну, как говорится, старый друг лучше новых двух:)
Відредаговано Snake (2006-10-30 13:50:08)
Поза форумом
Snake, а мог ли избранный мною double дать неточность в ответах? А то 2 дня за 8 баллов парюсь...
Поза форумом
Yevgeniy написав:
Шановні ЖУРІ!!! В умові задачі на тесті ДАНИЙ ПРИКЛАД ВИХІДНИХ ДАНИХ : 8.94427190999159Е+000. Звідки слідує, що дані потрібно виводити у експотенціальній формі, тобто на С++ це буде так:
cout.setf(ios::scientific);
cout<<res;
НА С так:
printf("%le\n",res);
Тобто у прикладі ви даєте один формат даних, при тестуванні на повному наборі тестів ви даєте інший формат вихідних даних. ТОМУ ВИ ОБ'ЯЗАНІ ПЕРЕПРОВІРИТИ РІШЕННЯ УСІХ УЧАСНИКІВ НА ЦІЙ ЗАДАЧІ використовуючи два формата вихідних даних.
Да ладно, прям таки Об"язаны. Не надо так к жури обращатся. А то вдруг кому-то не понравится..?
Поза форумом
Skiminok написав:
Snake, а мог ли избранный мною double дать неточность в ответах? А то 2 дня за 8 баллов парюсь...
Скорее всего, у тебя тоже виноват не double, а вывод числа. Точности double хватает. А вот точность на выводе - другой вопрос. Здесь эта проблема собственно и обсуждается. Как ты выводил ответ?
Поза форумом
Yevgeniy написав:
Шановні ЖУРІ!!! В умові задачі на тесті ДАНИЙ ПРИКЛАД ВИХІДНИХ ДАНИХ : 8.94427190999159Е+000. Звідки слідує, що дані потрібно виводити у експотенціальній формі, тобто на С++ це буде так:
cout.setf(ios::scientific);
cout<<res;
Але з тесту з умови випливає і те, що треба писати не cout<<res;, а:
cout << setprecision(14) << Res << endl;
Поза форумом
В умові сказано вивести результат не округлюючи. На форумі було сказано, що точності задавати не потрібно, просто вивести результат, а віповідний компільтор забезпечить необхідну точність.Отже
cout.setf(ios::scientific);
cout<<res;
Поза форумом
Sharp написав:
Еще более неприятная обстановка складывается в случае использования стандартного ввода/вывода C++ через cout. В этом случае для достижения точности, которая требуется для прохождения всех тестов, необходимо использовать НЕ СТАНДАРТНЫЙ способ, заключающийся в изменении формата вывода с помощью cout.precision(число знаков)...
Ти знаєш.... я саме таким способом і зробив...:))) Результат - 20
#include <iostream.h>
#include <math.h>
#define min(a,b) (((a)<=(b))?(a):(b))
double inline dist(double ax,double ay,double bx,double by)
{
return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
}
int main()
{
cout.precision(20);
double xs,ys,x1,y1,x2,y2;
cin >> xs >> ys >> x1 >> y1 >> x2 >> y2;
double d1,d2,d3,d4;
d1=dist(x1,y1,-x2,y2);
d2=dist(x1,y1,x2,-y2);
d3=dist(x1,y1,2*xs-x2,y2);
d4=dist(x1,y1,x2,2*ys-y2);
cout << min(min(d1,d2),min(d3,d4));
return 0;
}
Поза форумом
cout.precision(20);
Вот эту строчку и обсуждаем.
Поза форумом