23

Я писал ЕГЭ по информатике, сегодня стали известны результаты. Почему-то в C4 мне поставили всего лишь 1 балл из 4, хотя задача наипростейшая. К сожалению, у меня нет точной формулировки задания, поэтому напишу по памяти. Вводится сначала число N (количество частиц), потом N скоростей частиц (по условию от -10000 до 10000). Нужно вывести произведение двух наибольших из скоростей. Причём это нужно сделать эффективно по памяти и вычислениям. Вот мой код (точь-в-точь из моей работы):

#include <iostream>
using namespace std;

int main()
{
    int N; cin >> N;
    int m[2]={-10000, -10000};
    for(int i=0; i<N; i++)
    {
        int mi=(m[1]<m[0]);
        int v; cin >> v;
        m[mi]=(m[mi]<v)? v: m[mi];
    }
    cout << m[0]*m[1];
    return 0;
}

Проверил на компьютере у себя, всё нормально работает. Программа эффективна, потому что не заносит все числа в массив, а считает всё по мере ввода чисел. Если не найдёте ошибку в алгоритме, пойду на апелляцию. То ли я неправильно понял условие задачи (тут вы мне конечно не поможете), то ли проверяющим не понравился смайлик (m[1]<m[0]), то ли они не проверили мой дополнительный бланк ответов, на котором была написана вторая половина решения.

Обновление

У меня тут другие подозрения появились. Возможно, что мой код вообще не проверяли, потому что организаторша в ППЭ неправильно номер дополнительного бланка написала и жирно исправила цифру 7 на 3. Возможно, что компьютер принял эту цифру за 8 и из-за этого проверили только часть задания на первом бланке, где написан алгоритм программы на русском языке. Это подтверждается тем, что в критериях оценки написано, что один балл ставится, если "по приведённому тексту решения ясно, что экзаменуемый понимает, из каких этапов должно состоять решение задачи". Только факт того, что я скачал в Интернете все свои бланки, этому противоречит.

Обновление 2

Всё, нашёл ошибку (см. мой ответ). Всё прояснилось, на апелляцию не пойду.

northerner

Алгоритм очень плохой. Реально плохой. Как раз на 1 балл. И да, я эксперт ЕГЭ.

А так лучше?

#include <iostream>
using namespace std;

int main()
{
    int N; cin >> N;
    int m[2]={-10000, -10000};
    int n[2]={10000, 10000};
    for(int i=0; i<N; i++)
    {
        int mi=(m[1]<m[0]), ni=(n[1]>n[0]);
        int v; cin >> v;
        if(m[mi]<v) m[mi]=v;
        if(n[ni]>v) n[ni]=v;
    }
    cout << max(m[0]*m[1], n[0]*n[1]);
    return 0;
}
Kromster
  • 13,809
devoln
  • 5,441
  • 2
    На первый взгляд, если вход нормальный и N > 1, то правильно.

    Может быть следовало рассмотреть варианты с N < 2 ?

    – avp Jun 07 '12 at 11:34
  • Проверяет вероятней всего какаето тетя Таня, которая в программировании вообще нечего не шарит, у нее есть листочек с ответом, там через while написано, буквы не совпадают, бабла для нее в конверте нету, отсюда вместо 4х - 1 – Gorets Jun 07 '12 at 11:36
  • Видимо не совпало с ответами :) По-моему всё правильно, если не учитывать лишнего присваивания m[mi] самому себе в случае, если пришло не большее число. – sercxjo Jun 07 '12 at 11:38
  • А условие if ты вообще проверяешь непонятным недя кого способом =) это же ЕГЭ... – Gorets Jun 07 '12 at 11:38
  • @sercxjo, а вот присвавание после дополнительной проверки будет менее эффективно. Прикиньте машинный код. – avp Jun 07 '12 at 11:40
  • N<2 следует считать некорректным, поскольку как выбирать 2 из 1 – sercxjo Jun 07 '12 at 11:59
  • На первый взгляд, если вход нормальный и N > 1, то правильно.

    Может быть следовало рассмотреть варианты с N < 2 ?

    Кажется, в условии тоже про это было сказано. По-моему, как раз минимум два элемента должны быть.

    Видимо не совпало с ответами :)

    Какие могут быть ответы, если в программировании результатов - миллионы?

    По-моему всё правильно, если не учитывать лишнего присваивания m[mi] самому себе в случае, если пришло не большее число.

    Обычно в C пишут то же самое через макрос max. Я бы его использовал, но боялся, что он не определён или будет конфликтовать с std::max.

    – devoln Jun 07 '12 at 12:10
  • 2
    Отличный код, создатели ЕГЭ на такое не расчитывали видимо. – margosh Jun 07 '12 at 12:12
  • @avp почему будет менее эффективно? – sercxjo Jun 07 '12 at 12:13
  • 2
    @sercxjo, если Вы по поводу конкретного кода
    m[mi]=(m[mi]<v)? v: m[mi]; 
    
    

    вместо

    if (m[mi]<v) m[mi] = v;
    
    

    то Вы правы, а я погорячился. Вариант с if лучше.

    – avp Jun 07 '12 at 12:24

8 Answers8

11
  • Мне кажется, что если бы вы написали бы программу, аналогичную вашей, но не занимаясь Code golf'ом, то получили бы 4/4 (если, конечно, условия типа N >= 2 действительно фигурируют в задании). Потенциально еще можно было проверить input на корректность.
#include <iostream>
#include <cassert>

int main(int argc, char* argv[]) { static const int MIN_VALUE = -10000; static const int MAX_VALUE = 10000;

int n;
std::cin &gt;&gt; n;
assert(n &gt;= 2);

int firstMaximum = MIN_VALUE;
int secondMaximum = MIN_VALUE;
for (int i = 0; i &lt; n; ++i)
{
    int velocity;
    std::cin &gt;&gt; velocity;
    assert(velocity &gt;= MIN_VALUE &amp;&amp;
           velocity &lt;= MAX_VALUE);

    if (velocity &gt; firstMaximum)
    {
        secondMaximum = firstMaximum;
        firstMaximum = velocity;
    }
    else if (velocity &gt; secondMaximum)
    {
        secondMaximum = velocity;
    }
}

std::cout &lt;&lt; firstMaximum * secondMaximum;
return 0;

}

M. Williams
  • 23,562
  • но не занимаясь Code golf'ом

    Для меня та конструкция привычна, я ей пользуюсь давно, и не вижу в ней ничего сложного. На то, чтобы её придумать и написать у меня уходит меньше времени, чем написание этих больших if'ов.

    – devoln Jun 07 '12 at 13:08
  • 7
    @GLmonster Только вы забываете, что пишете код не для себя, а для других людей :) – M. Williams Jun 07 '12 at 13:10
  • Ну что тут сказать. Грамотная, понятная, эффективная, легко модифицируемая ...

    Просто образец для разных экзаменов.

    – avp Jun 07 '12 at 13:17
  • @Котик люто бешено плюсую на счет кода для других. В идеале было чтобы весь код был понятен тому кому его могут передать. Иногда бывает слишком много времени уходит на понимание, и уже что-то добавить свое страшно становится – misha_m Jun 07 '12 at 13:51
  • Только вы забываете, что пишете код не для себя, а для других людей :)

    Даже и подумать не мог, что эта конструкция такая сложная, как здесь все считают. Я даже вообще хотел её вместо mi подставить, не заводя переменную, но подумал, что будет менее читабельно. А вообще это как раз в духе ЕГЭ. Там в заданиях части A и B истину обозначают 1, ложь - 0. А тут и есть условие, которое даёт 0 или 1. Логично ведь?

    – devoln Jun 07 '12 at 13:53
  • 1
    @GLMonster никто её тут сложной не считает. Только тут у вас 3 строки. А представляете когда такого кода хотя бы 1000 строк. А тех кто проверяет ЕГЭ, мы увы знать не можем (проверял бы кто-то из нас, скорее всего 4/4 получили бы :) ) – misha_m Jun 07 '12 at 13:55
  • upd. Коли выяснилось, что задание было другое соглашусь с оценкой. Тем более появилися эксперт ЕГЭ и разъяснил критерии. У нас я тоже знаю экспертов (преподаватели нашего ВУЗа), вполне адекватные люди. – misha_m Jun 07 '12 at 15:53
11

Кое-что узнал в Интернете. Оказывается, я не учёл того, что произведение двух больших по модулю отрицательных чисел может быть больше, чем положительных, а по условию надо было указать именно наибольшее произведение, а не произведение наибольших чисел. Вот блин...

devoln
  • 5,441
  • ну так, это все проясняет:) – KoVadim Jun 07 '12 at 14:10
  • Жаль, столько обсуждали, а программа решает не ту задачку... – avp Jun 07 '12 at 14:16
  • 1
    Но не один же балл! В критериях к задаче C4 (правда другой) написано: "Три балла также выставляется, если в эффективной программе, удовлетворяющей критериям выставления 4 баллов, есть одна ошибка, в результате которой программа работает неверно на некоторых наборах нетипичных входных данных".

    Жаль, столько обсуждали, а программа решает не ту задачку...

    А мне-то как жаль... Даже не знаю, идти ли на апелляцию теперь. Ладно, пойду всё равно, наверное.

    – devoln Jun 07 '12 at 14:21
  • теперь осталось доказать, что программа работает "правильно" в большинстве случаев. Проверять правильнее всего на компьютере (что бы у проверяющих не было шансов давить утверждением "а мне не понятно!"). При правильном подходе и подборе входных данных можно и 4 бала получить:) – KoVadim Jun 07 '12 at 14:28
  • 2
    по-моему это стоит указать в тексте вопроса – Spectre Jun 07 '12 at 14:31
  • @GLmonster, на апелляцию все равно идите, вдруг в Интернете Вы нашли другую задачу ?

    Но, если ту, то для правильного решения надо было искать отдельно 2 максимума и 2 минимума. Сможете доказать, что это именно одна ошибка для нетипичных данных ?

    – avp Jun 07 '12 at 14:33
  • по-моему это стоит указать в тексте вопроса

    Что именно указать?

    вдруг в Интернете Вы нашли другую задачу ?

    Как раз другую и нашёл. В той надо минимальное произведение найти. Просто по аналогии вспомнил, что у меня тоже нужно найти наибольшее произведение, а не произведение наибольших чисел.

    Сможете доказать, что это именно одна ошибка для нетипичных данных ?

    В смысле, доказать отсутствие других ошибок? Других вроде нет.

    – devoln Jun 07 '12 at 15:02
  • @GLmonster, ваш ответ – Spectre Jun 07 '12 at 15:05
  • 2
    Нет, здесь очевидно один балл. Один в один по критериям. Я на самом деле сочувствую автору, потому что в этом году каждый первичный балл C4 стоит трёх баллов в стобалльной шкале, следовательно, теряя 3 первичных балла теряешь сразу 9 - и это как-то слишком жестко, но, увы, ничего не попишешь. – northerner Jun 07 '12 at 15:24
  • Нет, здесь очевидно один балл. Один в один по критериям.

    А где можно посмотреть на критерии? А то я смотрел на критерии из своей диагностической работы с другой задачей, думал, что они похожи.

    Я на самом деле сочувствую автору

    Да, дорого мне стоила моя невнимательность и уверенность. Не надо было на полчаса раньше с экзамена уходить... Ну ладно, на поступление в вуз это не повлияет, моих 88 баллов для этого вполне хватит. Просто, я не могу успокоиться, пока не узнаю, в чём я не прав или не докажу свою правоту.

    – devoln Jun 07 '12 at 16:32
  • А где можно посмотреть на критерии?

    Официально нигде. Там на этом документе так и написано: "копирование не допускается". Можете все равно сходить на апелляцию - маловероятно, что поднимут (хотя и такое бывает, эксперт в конфликтной комиссии - тоже человек), но должны обосновать оценку и не исключено, что покажут критерии.

    Ну ладно, на поступление в вуз это не повлияет

    Вот это самое главное. В остальном - это просто экзамен, нет смысла зацикливаться, лучше сосредоточиться на остальных экзаменах (говорят, математика была сложная). Успехов!

    – northerner Jun 08 '12 at 06:47
11

Автор неверно написал в теме условие задачи, необходимо найти максимальное из произведений всех пар скоростей, а не произведение двух наибольших скоростей. В критериях выставления одного балла четко написано:

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

Здесь пошла нездоровая дискуссия о том, что, мол, школьные учителя ничего не понимают в программировании, поэтому работу зарезали. Так вот, я к тому, что в данном случае всё совершенно не так, один балл выставлен справедливо.

northerner
  • 4,201
  • 2

    Здесь пошла нездоровая дискуссия о том, что, мол, школьные учителя ничего не понимают в программировании

    Вообще-то, в школе у меня в школе такой учитель и был. В диагностических работах только части A и B с ответами сверял, а C даже не смотрел. Дал спецификацию и сказал проверять самостоятельно. Правда на то, чтобы стать экспертом он и не претендовал.

    – devoln Jun 07 '12 at 19:12
  • Это правда, так бывает. Экспертная комиссия ЕГЭ формируется 50 на 50 из школьных учителей и преподавателей ВУЗов.

    Интересно, как ваш учитель поступил с последней тренировочной статградовской работы, где правильные ответы были перемешаны между вариантами.

    На вопрос @avp (там кончился лимит комментариев): зависит от контекста, решая задачку на олимпиадном сервере, я бы как-то так и сам написал, в серьезном проекте избегал бы подобного и другим членам команды не рекомендовал бы.

    – northerner Jun 08 '12 at 06:39
  • 1
    М... А разьве произведение двух наибольших скоростей не равно максимальному произведению их всех пар скоростей? – oleg_ismaylov Jun 08 '12 at 07:11
  • @oleg_ismaylov -10000 * -10000 – M. Williams Jun 08 '12 at 07:32
  • Скорость - векторная величина. Поэтому не может быть отрицательной. – oleg_ismaylov Jun 08 '12 at 07:38
  • 1
    @oleg_ismaylov
    • Проекции векторов еще никто не отменял.

    • Если вы действительно хотите продолжить этот разговор, то скорость как векторная величина не может быть и положительной, поскольку в данном контексте имеет смысл только положительность / отрицательность какой-либо R1 метрики, введенной для векторов.

    • И да, если уж говорить о скорости как о векторной величине, то как в контексте данной задачи вы представляете себе произведение скоростей?

    – M. Williams Jun 08 '12 at 07:46
  • я имел ввиду, что скорости - только положительные. – oleg_ismaylov Jun 08 '12 at 09:43
  • @oleg_ismaylov Понятненько. – M. Williams Jun 08 '12 at 10:03
10

@Котик, mi=(m[1]<m[0]) это правильно (по хакерски).

Использование граничных значений для алгоритма - вполне в духе, скажем, Д. Кнута.

А вот к N < 2 действительно можно придраться. Но если не придираться, то IMHO super. Я бы пошел на апелляцию.

avp
  • 46,098
  • 6
  • 48
  • 116
  • 6
    Не думаю, что кому-то нужно знаменитое "хакерство", KR-like способ закодировать что-то и т.д. на ЕГЭ. А вот написать код, который поймет тетя Таня и дядя Вася - это тоже искусство. Разумеется, на правах IMHO. – M. Williams Jun 07 '12 at 12:18
8

вполне вероятно, что во время написания ЕГЭ, вы упустили какую-то важную деталь, которую сочли незначительной. а так как вы воспроизвели задачу по памяти, вероятность того что вы упустили ее при репродукции еще выше...

любые рассмотрения кода не имеют смысла пока не будет представлено точное ТЗ

jmu
  • 6,252
  • вполне вероятно, что во время написания ЕГЭ, вы упустили какую-то важную деталь, которую сочли незначительной

    Я допускаю, что я мог неправильно понять условие, но его у меня нет. Поэтому я пытаюсь исключить по крайней мере всё остальное. Но исходный код точно такой же, я его переписал со скана листа работы.

    любые рассмотрения кода не имеют смысла пока не будет представлено точное ТЗ

    К сожалению, не будет. Ладно, на апелляции узнаю.

    – devoln Jun 07 '12 at 13:00
  • 2
    @GLmonster, попробуйте поискать в нете схожие задания - говорят, некоторые варианты задач можно найти, может и Ваша среди них встретится – margosh Jun 07 '12 at 13:09
7

Алгоритм оч. хороший. Реально хороший. Особенно нравится выражение mi=(m[1]<m[0]) - это заслуживает отдельной похвалы за кодирование полузабытом штиле Кернигана-Ритчи. Надо идти на апелляцию.

Update

@Northener писал:

Автор неверно написал в теме условие задачи, необходимо найти максимальное из произведений всех пар скоростей, а не произведение двух наибольших скоростей.

Это конечно меняет все. В этом случае алгоритм работает неверно, увы. Но автор все равно молодец - я получил эстетическое удовольствие от предложенного алгоритма.

Barmaley
  • 81,300
  • 3

    Надо идти на апелляцию.

    Завтра пойду писать заявление.

    – devoln Jun 07 '12 at 12:46
  • 4

    Алгоритм оч. хороший. Реально хороший.

    Алгоритм очень плохой. Реальной плохой. Как раз на 1 балл. И да, я эксперт ЕГЭ.

    – northerner Jun 07 '12 at 15:18
  • @northerner, объясните подробно.

    А то Вы оцениваете учеников, а мы им работу потом даем. Интересно несовпадение критериев.

    – avp Jun 07 '12 at 15:27
  • @northerner, с тем, что программа не ту задачу решает все ясно (вопросов нет). Вопрос об
    Алгоритм очень плохой. Реально плохой
    
    
    

    для задачи, как ее автор описал.

    – avp Jun 07 '12 at 15:37
  • 2
    @northerner А как при выставлении общего балла относятся к вещам типа mi=(m[1]<m[0])? – M. Williams Jun 07 '12 at 15:37
  • 1
    @Котик_хочет_кушать, используемые конструкции и стиль не играют роли. Хорошо это или плохо - другой вопрос, факт, что критерии явным образом определяют правила игры так.

    Другое дело - человеческий фактор. Эксперт может ошибиться. Правда для этого каждую работу и проверяют двое отдельно, при разнице в один балл ставится большая оценка, при большей разнице включается третий эксперт, и предусмотрена апелляция. Но все же рекомендую писать по-человечески - ниже вероятность срезать верное решение.

    – northerner Jun 07 '12 at 15:49
  • @Spectre, даже если не по абсолютному значению, то у 2-х самых отрицательных произведение может оказаться максимальным. – avp Jun 07 '12 at 15:52
  • Два года назад я участвовал в конфликтной комиссии и повышал балл, когда например, паренек использовал в качестве проверки на нечетность выражение (x & 1), а оба эксперта зарезали.

    Тем более, в C4 ЕГЭ допускается любой язык высокого уровня, но то есть вообще любой. В этом году кроме стандартных Pascal, C, C++ мне попадался только Python, но год на год не приходится - в прошлом году был знатный зоопарк. PHP, например, попадался. Эксперт может быть не знаком с языком, но он обязан проверить.

    – northerner Jun 07 '12 at 15:53
  • @avp, да, вы абсолютно правы

    @northerner, наверно, из ваших комментов стоит сделать ответ, т.к. он будет наиболее верным

    – Spectre Jun 07 '12 at 15:58
  • @northerner, и все таки, алгоритм плохой ? – avp Jun 07 '12 at 16:00
  • А то Вы оцениваете учеников, а мы им работу потом даем.

    Я и тем, и другим занимаюсь. Критерии, конечно, разные, потому что цели разные и, соответственно, диагностируемый набор компетенций.

    – northerner Jun 07 '12 at 16:03
  • Тем более, в C4 ЕГЭ допускается любой язык высокого уровня, но то есть вообще любой. Эксперт может быть не знаком с языком, но он обязан проверить.

    Думал на D написать сначала, но передумал. Слишком уж быстро язык меняется и наловить кучу ошибок очень легко.

    Angry Bird, не заметил, удалил.

    – devoln Jun 07 '12 at 19:19
  • В этом случае алгоритм работает неверно, увы. Но автор все равно молодец - я получил эстетическое удовольствие от предложенного алгоритма.

    Я его исправил в обновлении вопроса 2. Теперь можешь получать эстетическое удовольствие от исправленного. Больше он ни на что не годится, потому что баллы не поменяет.

    – devoln Jun 08 '12 at 08:39
5

Что то я не видел, что бы кто то писал о отрицательных скоростях. Если оставить в стороне то, что нужен ещё вектор направления, то отрицательная скорость - это просто движения в противоположную сторону. В исходном коде бы исправил начальные значения на int m[2]={0, 0}; и при вводе скорость брал бы по модулю.

Но вот выражение mi=(m[1]<m[0]) на ЕГЭ я бы не писал. При собеседовании - можно (а иногда даже нужно), на ЕГЭ - не стоит.

KoVadim
  • 112,121
  • 6
  • 94
  • 160
  • выражение mi=(m[1]<m[0]) должно вернуть 0 если m[0]>=m[1] и 1 в противном случае? Я вот точно не помню, но в сях по описанию вроде значение 0 - это фалсе, отличное от нуля - труе. И почему будет такая уверенность что тру компилятор преобразует в 1? может так же преобразовать в m[0]-m[1]? Или я что то путаю? – Чад Jun 07 '12 at 12:27
  • 1
    а я не утверждаю, что оно возвратит только 0 или 1. В стандарте я такого утверждения не нашел. Поэтому на ЕГЭ и не стоит так делать. А вот на собеседовании, когда можем выбирать компилятор, можно и использовать, там объяснять проще будет. – KoVadim Jun 07 '12 at 12:31
  • 1
    кстати, а вроде не было сказано что скорости целые – sercxjo Jun 07 '12 at 12:31
  • Что то я не видел, что бы кто то писал о отрицательных скоростях. Если оставить в стороне то, что нужен ещё вектор направления, то отрицательная скорость - это просто движения в противоположную сторону.

    Отрицательные скорости были по условию. Это я точно помню.

    Но вот выражение mi=(m[1]<m[0]) на ЕГЭ я бы не писал.

    А как ещё, через if'ы целых две строчки писать? Или (m[1]<[m[0])? 1: 0?

    – devoln Jun 07 '12 at 12:33
  • 3
    Классическая проблема - либо сразу пишем три строки и получаем хороший бал, либо пишем одну, потом ходим, доказываем. Как по мне - первое значительно эффективно. Так что топикстартер решил задачу не оптимально. выражение (m[1]<[m[0])? 1: 0 - более красивое.

    Но в целом, задача написана на с, а не на с++.

    – KoVadim Jun 07 '12 at 12:36
  • я нашел такие входные данные, когда код не решает поставленную задачу. например, если все входные данные равны алгоритм не работает:) проверьте при входных данных
    3
    -9999
    9999
    0
    
    

    я ожидаю в ответе не 0.

    – KoVadim Jun 07 '12 at 12:40
  • @KoVadim, я имел в виду что такие выражение можно писать зная чётко что за компилятор, платформа и т.д. Это как раз согласие с вашим утверждением о запрете. – Чад Jun 07 '12 at 12:41
  • @KoVadim, во чем-то Вы правы, но если смотреть глубже, то мне вообще непонятен смысл перемножения скоростей разных объектов. – avp Jun 07 '12 at 12:42
  • И почему будет такая уверенность что тру компилятор преобразует в 1?

    Всю жизнь так вроде было. На gamedev'е была такая тема, где функцию получения знака числа так написали, как у меня ниже. Даже никто не усомнился в том, что это стандартное поведение, хотя там любят это обсуждать.

    и при вводе скорость брал бы по модулю.

    Например, используя смайлик в моём стиле: v*((v>0)-(v<0)).

    кстати, а вроде не было сказано что скорости целые

    В ЕГЭ все числа целые во всех задачах.

    – devoln Jun 07 '12 at 12:45
  • 2
    @GLmonster - принципиального отличия между if и mi = (m[1]<[m[0]) нету, и там и там скорее всего сгенерируется код который вычтет одно число из другого и проверит флаги, только второй вариант сильно зависит от аппаратной части и версии и настроек компилятора, не предвнося понимания кода, тогда как вариант с if даст более простой для понимания код, без потери качества генерируемого выполняемого кода. – Чад Jun 07 '12 at 12:46
  • я ожидаю в ответе не 0.

    По условию было перемножение именно максимальных значений, а 0 и 9999 и есть максимальные.

    мне вообще непонятен смысл перемножения скоростей разных объектов.

    В условии объяснялось, что это нужно для того, чтобы дать название, характеризующее отдельные эксперименты. Ну вообще всё это словесная мишура, а что именно надо делать должно было быть написано чётко, чтобы не нужно было догадываться.

    – devoln Jun 07 '12 at 12:55
  • 2
    @KoVadim,
    я нашел такие входные данные, когда код не решает поставленную задачу
    
    

    Проверил на Вашем примере, а также, когда все числа равны - нет все работает (программа правильная).

    – avp Jun 07 '12 at 13:06
  • я считаю, что при исходных данных
    3
    -9999
    9999
    0
    

    правильный ответ должен быть 99980001 ( = 9999*9999).

    И ещё. Программа не проверяет, что введенное N - отрицательное либо 0. Как по мне - это большой минус.

    – KoVadim Jun 07 '12 at 13:19
  • 3
    @KoVadim Нулевая скорость больше, чем отрицательная. Если, конечно, в задаче не фигурировал модуль. – M. Williams Jun 07 '12 at 13:24
  • Программа не проверяет, что введенное N - отрицательное либо 0. Как по мне - это большой минус.

    В реальных программах - да. Но в условии было чётко сказано, что как минимум будет 2 элемента. Тем более, что не понятно, что выводить при N<1.

    Если, конечно, в задаче не фигурировал модуль.

    Вроде не фигурировал.

    – devoln Jun 07 '12 at 13:46
  • В оригинальном условии задачи, разумеется, было сказано, что числа целые:

    На вход программе в первой строке подается количество частиц N. В каждой из последующих строк записано одно целое число со знаком, по абсолютной величине не превышающее 10000.

    Там же было сказано, что перемножать нужно скорости различных частиц.

    – northerner Jun 07 '12 at 16:12
5

Не разделяю восторгов по поводу хакерски-керниганского кода.

int mi=(m[1]<m[0])

Подумайте, какой тип данных возвращает rvalue и какой тип вы объявляете для lvalue, учитывая, что речь идёт о крестах, а не о труси бородатых времен Ритчи.

Какие могут быть ответы, если в программировании результатов - миллионы?

О правильных (проверенных вручную!) ответах на определенный тестовый набор данных. Знаете, как работают юнит-тесты?

В целом, как уже отметили предыдущие ораторы, не помня точного задания бессмысленно оценивать правильность реализации, и остается только оценивать стиль, который, как уже тоже отметили, возможно, хорош для codegolf'а, но не для прочтения человеком, тем более настроенным критически и от которого зависит оценка работы.

karmadro4
  • 2,449
  • 2

    Подумайте, какой тип данных возвращает rvalue и какой тип вы объявляете для lvalue

    Судя по всему, bool, который конвертируется в int.

    Далее, кстати, у вас потенциальный выход за пределы массива.

    true - 1, false - 0. Разве может быть по-другому?

    речь идёт о крестах, а не о труси бородатых времен Ритчи.

    А как же обратная совместимость? Разве даже в таких мелочах не сохраняется обратная совместимость?

    – devoln Jun 07 '12 at 15:09
  • 1
    @karmadro4, в g++ код работает.

    Самое главное, автор продемонстрировал нетривиальный подход к поиску 2-х максимальных элементов, т.е. творческое мышление, а также способность писать компактный код в условиях дефицита времени (экзамен).

    @GLmonster, очень интересно, а сколько программок надо было написать и за какое время ?

    --

    В данных условиях - это 5+.

    Другой вопрос, если код решает не ту задачу. Тогда из автоматизированных тестов пройдет только компиляция и исполнение с кодом возврата 0.

    – avp Jun 07 '12 at 15:10
  • 2
    @GLmonster Программировать на C++, исходя из обратной совместимости с C - это самое страшное, что только можно предпринять. Отсюда и рождаются грабли с миллионами new / delete в коде, вещи типа operator bool, отсюда растут ноги у использования int для хранения значения булевского выражения и C-style касты, ломающие использование vfptr и vcbl. Если уж взялись писать на C++, то используйте bool для хранения булевского значения. – M. Williams Jun 07 '12 at 15:23
  • @GLmonster,

    Судя по всему, bool,

    Совершенно верно, bool. Но вы этог тип не использовали, а прибегли к инту a-la труси.

    true - 1, false - 0. Разве может быть по-другому?

    Неправильно, const bool false = 0; const bool true = !false;, остальное - implementation specific.

    А про обратную совместимость уже Котик хорошо сказал.

    @avp, странная у вас логика. Если

    способность писать компактный код в условиях дефицита времени это 5+

    то тогда сколько же баллов за развернутый код? ;-) Кстати, весьма символично, что компактность нарушается когда дело доходит до тернистого оператора :-)

    – karmadro4 Jun 07 '12 at 16:21
  • Программировать на C++ в духе C - это самое страшное, что только можно предпринять, поскольку C++ - это совершенно другой язык.

    Я даже и не подозревал, что программирую в духе C. Я с самого начала начинал изучать C++.

    Если уж взялись писать на C++, то используйте bool для хранения булевского значения.

    Дело не в этом (см. ниже).

    Совершенно верно, bool. Но вы этог тип не использовали, а прибегли к инту a-la труси.

    Потому что для типа индекса массива логичнее использовать int. bool бы тоже сработал, но int читабельнее.

    – devoln Jun 07 '12 at 16:43
  • Неправильно, const bool false = 0; const bool true = !false;, остальное - implementation specific.

    Доказательство?

    очень интересно, а сколько программок надо было написать и за какое время ?

    В части A 13 заданий с выбором варианта ответа, в B - 15 с кратким ответом. Экспертами проверяется только часть C. C1 - поиск ошибки в программе и указание способа исправления. C2 - написание небольшого фрагмента программы. Обычно 4-5 строк: пройтись по массиву и что-то сделать с его элементами. C3 - задача, не связанная с программированием. C4 вы сами видели. На всё даётся 4 часа.

    – devoln Jun 07 '12 at 16:43
  • @GLmonster
    • Я ничего не сказал конкретно про вас, тем более без реальных фрагментов кода вряд ли можно сказать, как вы программируете. Тем не менее, я обратил свое внимание на то, что сохранять значение булевского типа в переменной типа int, имея в распоряжении тип bool - это жесткий ANSI-C стайл.

    • Утверждения о читабельности, как мы выяснили в этом треде, настолько спорны и недоказуемы, что вряд ли можно применять их как аргумент.

    – M. Williams Jun 07 '12 at 18:14
  • 1
    @GLmonster
    • Утверждение про implementation-specific bool, судя по всему, некорректно, либо я неправильно интерпретирую пункт 4.7 - Integral Conversions стандарта C++.

    If the source type is bool, the value false is converted to zero and the value true is converted to one.

    – M. Williams Jun 07 '12 at 18:14
  • @GLmonster, хм, это я, пожалуй, попутал с _Bool из сей недавнего разлива. Таким образом с потенциальным выходом за пределы я был неправ. – karmadro4 Jun 07 '12 at 18:27
  • If the source type is bool, the value false is converted to zero and the value true is converted to one.

    Ну вот, то что я утверждал и подтвердилось: трюк от реализации не зависит.

    сохранять значение булевского типа в переменной типа int, имея в распоряжении тип bool - это жесткий ANSI-C стайл.

    Если бы я увидел код

    int condition=(x<0);
    if(condition) ...;
    
    

    то я бы тоже негодовал и заменил бы на bool, но когда это значение используется как индекс массива, логичнее использовать int.

    – devoln Jun 07 '12 at 18:33
  • Хмм... Однако, тенденция! Я слоупочу, а Котик перехватывает все мои реплики и даже поправляет меня если ошибусь :-)

    Насчет типа индекса массива всё неоднозначно, к примеру в Паскале логический тип принадлежит множеству порядковых типов и запись array[Boolean] of ... была бы кошерной, а в крестах из-за слабой типизации всё превращается в неявную кашу.

    – karmadro4 Jun 07 '12 at 19:40
  • 1
    @karmadro4 Я вообще недавно был шокирован тем, что у меня вот эта вот страница попала в топ16 вкладок хрома :) – M. Williams Jun 07 '12 at 20:19