Вопрос по задаче (C4) в ЕГЭ по информатике

303
25 сентября 2017, 03:29

Считается ли мое решение эффективным по времени? Понимаю, что по памяти оно неэффективно, т.к используются структуры данных\контейнеры, а вот по времени не знаю как определить.

Условие задачи:

С4
По каналу связи передаются положительные целые числа, не превышающие 1000. После окончания передаётся контрольное значение – наибольшее число R, удовлетворяющее следующим условиям:

1) R — сумма двух различных переданных элементов последовательности.
2) R — нечётное число.

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

Программа считается эффективной по времени, если время работы программы пропорционально количеству элементов последовательности N, т.е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз.

#include <iostream>
#include <vector>
#include <conio.h>
#include <algorithm>
int main()
{
    std::vector<int> vec;
    std::vector<int>::size_type count;
    std::cin >> count;
    for (std::vector<int>::size_type i = 0; i < count; i++) {
        std::vector<int>::size_type current;
        std::cin >> current;
        vec.push_back(current);
    }
    std::sort(vec.begin(), vec.end());
    std::vector<int>::size_type maximum = 0;
    std::vector<int>::size_type left = vec.size() - 2;
    std::vector<int>::size_type right = vec.size() - 1;
    for ( std::vector<int>::size_type i = 0; ++i < vec.size(); )
    {
        std::vector<int>::size_type summary = vec[left] + vec[right];
        if ((maximum < summary) && (summary & 1 != 0)) 
        {
            maximum = summary;
            left--;
        }
        else { 
            if ((summary & 1) == 0)  {
                left--;
            }
            else {
                right--;
            }
        }
    }
    if (maximum) {
        std::cout << "\nFound: " << maximum;
    }
    else {
        std::cout << "\nNot found";
    }
    _getch();
}
Answer 1

После того, как вы вектор отсортировали, нет нужды в переборе. Вы должны взять наибольшее нечетное число плюс наибольшее четное. Сумма нечетная может быть, если одно число четное, а другое нечетное. Если нечетных нет, то и ответа нет. Не делайте сорт, который занимает nlog n, а просто ищите максимальное четное и нечетное за время n. Да, и хранить все данные в векторе не понадобится.

READ ALSO
gets_s() в цикле съедает первый символ в строке

gets_s() в цикле съедает первый символ в строке

Всем доброго времени сутокВот такой вопрос:

319
RunTime Error на DFS задаче C++

RunTime Error на DFS задаче C++

Первый раз написав решение этой задачи на привычном себе питоне, натолкнулся на ошибку TimeLimit, деваться некуда - переписал на С++, и теперь, на 15-м тесте...

356
Как поймать сигнал переопределенного QGraphicsPixmapItem в слот главного окна?

Как поймать сигнал переопределенного QGraphicsPixmapItem в слот главного окна?

Есть кастомный QGraphicsView, в нем отлавливаю эвенты мыши, чтобы скалировать и панарамировать изображениеВ QGraphicsScene лежит кастомный QGraphicsPixmapItem,...

307
Как удалить последний из тегов с одинаковыми id?

Как удалить последний из тегов с одинаковыми id?

На странице есть несколько тегов с одинаковым id (так получилось)Как при помощи jQuery удалить последний тег?

327