Форум программистов, компьютерный форум CyberForum.ru

Задача с тимуса №1881 - C++

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
04.07.2014, 15:49     Задача с тимуса №1881 #1
http://acm.timus.ru/problem.aspx?space=1&num=1881
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using std::cin;
using std::cout;
 
int main()
{
    int strok, simvolov, slov,
        tekStroka = 1, vTekStroke = 0; // номер текущей строки и кол-во символов в текущей строке
    char tekSlovo[101];
    cin >> strok >> simvolov >> slov;
 
    for (int i = 0; i < slov; i++)
    {
        cin.getline(tekSlovo,101);
        if (vTekStroke + strlen(tekSlovo) + (vTekStroke > 0? 1 : 0) <= simvolov)
            // если в строке уже есть слова, надо добавить 1 пробел
            vTekStroke += strlen(tekSlovo) + (vTekStroke > 0? 1 : 0);
        else
        {
            ++tekStroka;
            vTekStroke = strlen(tekSlovo);
        }
    }
    cout << tekStroka/strok + (tekStroka%strok > 0? 1 : 0);
    return 0;
}
Неправильный ответ на 4м тесте. В чем ошибка?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2014, 15:49     Задача с тимуса №1881
Посмотрите здесь:

C++ задача с Тимуса
задача с Тимуса C++
Задача с тимуса C++
C++ Задача с тимуса
C++ Задача с Тимуса 1446
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
04.07.2014, 16:07     Задача с тимуса №1881 #2
Х.з. в чем ошибка. Может условие выложить!?
gru74ik
Модератор
 Аватар для gru74ik
3110 / 1336 / 166
Регистрация: 20.02.2013
Сообщений: 3,800
Записей в блоге: 17
04.07.2014, 16:17     Задача с тимуса №1881 #3
Цитата Сообщение от castaway Посмотреть сообщение
Может условие выложить!?
1881. Длинное условие задачи
Ограничение времени: 0.5 секунды
Ограничение памяти: 64 МБ
Пока Федя писал условие для задачи «Летопись GOV», ему пришло в голову, что бумаги для печати условий может не хватить. А тут ещё оказалось, что в его текстовом редакторе нет возможности определить количество страниц в тексте. Однако Федя не растерялся и решил сам написать программу, рассчитывающую количество страниц по введённому тексту.
Он знал, что на каждой странице h строк, а в каждой строке w символов. Между каждой парой соседних слов в одной строке ставится ровно один пробел. Если слово не помещается в строку, Федя не делит его на слоги для переноса и не ставит пробел, а просто пишет всё слово с начала новой строки.
Исходные данные
В первой строке записаны целые числа h, w, n — количество строк на странице, символов в строке и слов в тексте задачи, соответственно (1 ≤ h, w ≤ 100; 1 ≤ n ≤ 10 000). В следующих n строках записан текст условия, которое написал Федя, по одному слову в строке. Слова в условии непусты, имеют длину не более w и состоят только из строчных и заглавных латинских букв и знаков препинания (точка, запятая, восклицательный и вопросительный знаки). Суммарная длина всех слов не превосходит 10 000.
Результат
Выведите количество страниц в тексте условия задачи.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
04.07.2014, 16:41     Задача с тимуса №1881 #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот правильный код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using std::cin;
using std::cout;
 
int main()
{
    int strok, simvolov, slov,
        tekStroka = 1, vTekStroke = 0; // номер текущей строки и кол-во символов в текущей строке
    char tekSlovo[101];
    cin >> strok >> simvolov >> slov;
    cin.ignore('\n', 10);
 
    for (int i = 0; i < slov; i++)
    {
        cin.getline(tekSlovo,101);
        if (vTekStroke + strlen(tekSlovo) + (vTekStroke > 0? 1 : 0) <= simvolov)
            // если в строке уже есть слова, надо добавить 1 пробел
            vTekStroke += strlen(tekSlovo) + (vTekStroke > 0? 1 : 0);
        else
        {
            ++tekStroka;
            vTekStroke = strlen(tekSlovo);
        }
    }
    cout << tekStroka/strok + (tekStroka%strok > 0? 1 : 0);
    return 0;
}
Единственное отличие от кода Керра, в том, что я добавил cin.ignore('\n', 10). Дело в том, что после того как считаешь 3 целых числа, в потоке будет стоять символ конца строки (обычно 2 символа - 10 и 13). И, затем эти символы ты попытаешься считать в строку (вместо нормальной первой строки). В итоге самая последняя строка не будет прочитана. cin.ignore позволяет выкинуть из потока эти ненужные символы.
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
04.07.2014, 16:58  [ТС]     Задача с тимуса №1881 #5
Dani, благодарю

Добавлено через 4 минуты
Dani, сработало, но почему не cin.ignore(10,'\n')? вроде такой у него синтаксис
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
04.07.2014, 17:06     Задача с тимуса №1881 #6
Перепутал значит. Вообще очень повезло: я от балды поставил число 10. А это ведь один из двух символов, которые используются для перевода строки (какой - не помню): либо возврат каретки, либо сам перевод строки.
Это число 10 было приведено в char и вот, собственно
Yandex
Объявления
04.07.2014, 17:06     Задача с тимуса №1881
Ответ Создать тему
Опции темы

Текущее время: 17:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru