Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Найти произведение двух наибольших скоростей


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

#include 
using namespace std;

int main()
{
    int N; cin >> N;
    int m[2]={-10000, -10000};
    for(int i=0; i> v;
        m[mi]=(m[mi]
using namespace std;

int main()
{
    int N; cin >> N;
    int m[2]={-10000, -10000};
    int n[2]={10000, 10000};
    for(int i=0; in[0]);
        int v; cin >> v;
        if(m[mi]v) n[ni]=v;
    }
    cout << max(m[0]*m[1], n[0]*n[1]);
    return 0;
}

    


Ответы

Ответ 1



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

Ответ 2



Мне кажется, что если бы вы написали бы программу, аналогичную вашей, но не занимаяс Code golf'ом, то получили бы 4/4 (если, конечно, условия типа N >= 2 действительно фигурируют в задании). Потенциально еще можно было проверить input на корректность. #include #include int main(int argc, char* argv[]) { static const int MIN_VALUE = -10000; static const int MAX_VALUE = 10000; int n; std::cin >> n; assert(n >= 2); int firstMaximum = MIN_VALUE; int secondMaximum = MIN_VALUE; for (int i = 0; i < n; ++i) { int velocity; std::cin >> velocity; assert(velocity >= MIN_VALUE && velocity <= MAX_VALUE); if (velocity > firstMaximum) { secondMaximum = firstMaximum; firstMaximum = velocity; } else if (velocity > secondMaximum) { secondMaximum = velocity; } } std::cout << firstMaximum * secondMaximum; return 0; }

Ответ 3



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

Ответ 4



@Котик, mi=(m[1]

Ответ 5



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

Ответ 6



Алгоритм оч. хороший. Реально хороший. Особенно нравится выражение mi=(m[1]

Ответ 7



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

Ответ 8



Не разделяю восторгов по поводу хакерски-керниганского кода. int mi=(m[1]

Комментариев нет:

Отправить комментарий