Я писал ЕГЭ по информатике, сегодня стали известны результаты. Почему-то в 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]
Комментариев нет:
Отправить комментарий