Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Почему ответ неверный??


Автор: lllJollyRogerlll 29.1.2015, 18:40
Опять я со своим криво написанным, запутанным кодом, но что уж поделаешь, я пока еще учусь. 
Итак, решаю задачу:
Цитата

1003. Чётность
Ограничение времени: 2.0 секунды
Ограничение памяти: 64 МБ
Вы играете со своим другом в следующую игру. Ваш друг записывает последовательность, состоящую из нулей и единиц. Вы выбираете непрерывную подпоследовательность (например, подпоследовательность от третьей до пятой цифры включительно) и спрашиваете его, чётное или нечётное количество единиц содержит эта подпоследовательность. Ваш друг отвечает, после чего вы можете спросить про другую подпоследовательность, и так далее.
Ваша задача — угадать всю последовательность чисел. Но вы подозреваете, что некоторые из ответов вашего друга могут быть неверными, и хотите уличить его в обмане. Вы решили написать программу, которая получит наборы ваших вопросов вместе с ответами друга и найдет первый ответ, который гарантированно неверен. Это должен быть такой ответ, что существует последовательность, удовлетворяющая ответам на предыдущие вопросы, но никакая последовательность не удовлетворяет этому ответу.
Исходные данные
Ввод содержит несколько тестов. Первая строка каждого теста содержит одно число, равное длине последовательности нулей и единиц. Эта длина не превосходит 109. Во второй строке находится одно неотрицательное целое число — количество заданных вопросов и ответов на них. Количество вопросов и ответов не превышает 5 000. Остальные строки содержат вопросы и ответы. Каждая строка содержит один вопрос и ответ на этот вопрос: два целых числа (позиции первой и последней цифр выбранной подпоследовательности) и одно слово — “even” или “odd” — ответ, сообщающий чётность количества единиц в выбранной подпоследовательности, где “even” означает чётное количество единиц, а “odd” означает нечётное количество. Ввод заканчивается строкой, содержащей −1.
Результат
Каждая строка вывода должна содержать одно целое число X. Число X показывает, что существует последовательность нулей и единиц, удовлетворяющая первым X условиям чётности, но не существует последовательности, удовлетворяющей X + 1 условию. Если существует последовательность нулей и единиц, удовлетворяющая всем заданным условиям, то число X должно быть равно количеству всех заданных вопросов.

Помогите пожалуйста разобраться. Спасибо большое!
Написал вот этот код:
Код

#include<iostream>
#include<string>
#include<ctime>

int main()
{
    unsigned int count;                        // величина последовательности нулей и единиц
    unsigned short questions;                // количество заданных вопросов и ответов на них
    short first_value;                        // первое число в диапазоне запроса
    short last_value;                        // последнее число в диапазоне запроса
    unsigned short if_even;                    // переменная для определения четности единиц
    unsigned short X = 0;                    // последовательность нулей и единиц, удовлетворяющая первым X условиям чётности
    std::string even_or_odd;                // вводимый пользователем ответ "even", или "true"
    bool users_if_even;                        // если пользователь вводит "even", то значение true, если "odd" - false
    bool last_user_answer = 1;                // если прошлый ответ пользователя верный - true, если нет - false

    std::cout << "What is the sequence nulls and ones?: ";
    std::cin >> count;
    bool* pArray = new bool[count];

    srand(time(0));
    for (int i = 0; i < count; i++)
    {
        bool tmp = (rand()%2);
        pArray[i] = tmp;
    }

    std::cout << "How many questions and answers?: ";
    std::cin >> questions;

    for (int i = 0; i < questions; i++)
    {
        std::cout << "Enter the range and through the space enter the answer, \"even\", or \"odd\"?: ";
        std::cout.flush();
        std::cin >> first_value;
        if (first_value == -1) break;                // если ввод "-1", выходим
        std::cin >> last_value;
        std::cin >> even_or_odd;
        if (first_value > last_value) break;        // если первое значение порядка в списке больше, чем второго - выходим
        if_even = 0;
        if (even_or_odd == "even") users_if_even = true;
        else users_if_even = false;

        for (int i = first_value-1; i <= last_value-1; i++)
        {
            if (pArray[i] == true) if_even++;
            else continue;
        }
        
        if (users_if_even && last_user_answer)
        {
            if (!(if_even > 0 && if_even % 2))
            {
                X++;
                last_user_answer = true;
            }
            else last_user_answer = false;
        }
        else if ((!users_if_even) && last_user_answer)
        {
            if (if_even > 0 && if_even % 2)
            {
                X++;
                last_user_answer = true;
            }
            else last_user_answer = false;
        }
        else continue;
    }

    std::cout << "X = " << X << std::endl;
    delete[] pArray;
    
    return 0;
}

Скидываю на проверку - пишет что ответ неверный. Что не так? Может я неверно понял условие?

Автор: borisbn 30.1.2015, 09:39
lllJollyRogerlll, мало кому захочется лезть на какой-то малоизвестный сайт, чтобы прочитать условие. Лучше скопировать условие прямо сюда. Я думаю, ничего страшного, что вопрос будет занимать много места.

Автор: lllJollyRogerlll 30.1.2015, 10:43
Цитата(borisbn @ 30.1.2015,  09:39)
lllJollyRogerlll, мало кому захочется лезть на какой-то малоизвестный сайт, чтобы прочитать условие. Лучше скопировать условие прямо сюда. Я думаю, ничего страшного, что вопрос будет занимать много места.

Скопировал. smile 

Автор: xvr 30.1.2015, 15:48
Исходные данные для вашей задаче находятся в файле. Результат так же выводится в файл. Сравнивать его будет робот, и ваши веселые сообщения от программы типа How many questions and answers?: и все остальные явно не совпадут с ожиданиями робота  smile 

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

Цитата(lllJollyRogerlll @  29.1.2015,  18:40 Найти цитируемый пост)
Может я неверно понял условие?

Похоже

Автор: lllJollyRogerlll 30.1.2015, 17:31
Цитата(xvr @ 30.1.2015,  15:48)
Исходные данные для вашей задаче находятся в файле. Результат так же выводится в файл. Сравнивать его будет робот, и ваши веселые сообщения от программы типа How many questions and answers?: и все остальные явно не совпадут с ожиданиями робота  smile 

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

Цитата(lllJollyRogerlll @  29.1.2015,  18:40 Найти цитируемый пост)
Может я неверно понял условие?

Похоже

Не понимаю, как мне вычислить содержимое массива, которого не существует..  smile 
Простите пожалуйста, за мою тупость... Мне открыть необходимо файл, в котором записан массив? Этот файл просто поместить в проект? Но на проверку отправляется только код... Не могу понять... smile 
Не могли бы вы разжевать мне условия этой задачи, тогда? 

Автор: feodorv 30.1.2015, 20:06
Цитата(lllJollyRogerlll @  30.1.2015,  17:31 Найти цитируемый пост)
Мне открыть необходимо файл, в котором записан массив?

Нет. Массив неизвестен.

Автор: xvr 2.2.2015, 14:36
Цитата(lllJollyRogerlll @  30.1.2015,  17:31 Найти цитируемый пост)
Не могли бы вы разжевать мне условия этой задачи, тогда?  

Условие задачи не в том, что бы написать программу по алгоритмну из условия, а в том, что бы придумать алгоритм и потом его изобразить в программе (что кстати считается вещью абсолютно тривиальной).

С вашим уровнем подготовки вещь практически нереальная. Поищите задачи попроще  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)