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

Подсчет количества минут от промежутка до промежутка без учета еще одного промежутка времени. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.08.2011, 16:39     Подсчет количества минут от промежутка до промежутка без учета еще одного промежутка времени. #1
Доброго времени суток.
В input.txt лежит четное число n и n дат. Нужно отсортировать эти даты и разбить их на пары. Одна - начало, другая конец. И найти суммарное количество минут между ними, не учитывая время от 18:00 до 10:00.
Полное условие тут.
Я прикинул, как будет выглядеть реализация этой задачи просто с функциями, и как я ее буду отлаживать... В общем, набросал простенькую структуру и перегрузил для нее >> и <
Получилось так
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
struct TDate{
    int day, month, hour, minute;
    
    inline static int day_in_month(int month)
    {
        switch (month)
        {
            case 2: 
                return 28; //год точно невисокосный
            case 1:     case 3:     case 5:
            case 7:     case 8:     case 10:
            case 12:
                return 31;
            default:
                return 30;
        }
    }
    
    
 
    inline bool operator < (const TDate& a) const
    {
        
        if (month != a.month)
            return month < a.month;
        if (day != a.day)
            return day < a.day;
        if (hour != a.hour)
            return hour < a.hour;
        
        return minute < a.minute;
    }
    
    inline friend std::istream& operator >> (std::istream& stream, TDate& date)
    {
        char tmp;
        stream >> date.day >> tmp >> date.month >> tmp >> date.hour >> tmp >> date.minute;
        return stream;
    } 
    
    inline TDate& add_minutes(int count)
    {
        minute += count;
        if (minute > 59)
        {
            hour += minute / 60;
            minute %= 60;
        }
        if (hour > 23)
        {
            day += hour / 24;
            hour %= 24;
        }
        while (day > day_in_month(month))
        {
            day -= day_in_month(month);
            ++month;
        }
        return *this;
    }
    
        
    inline int minutes_to(const TDate& date)
    {
        size_t count = 0;
        while (*this < date)
        {
            add_minutes(1);
            
            if (hour >= 18)
            {
                add_minutes(960);
            }
            ++count;
        }
        return count + (hour >= 18) ;
    }
 
};
int main(){
    
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    
    unsigned n;
    std::cin >> n;
    
    TDate * arr = new TDate [n];
    for (size_t i = 0; i < n; ++i)
        std::cin >> arr[i];
    
    std::sort( arr, arr + n );
    
    long long sum = 0;
    for (size_t i = 0; i < n - 1; i += 2)
    {
        sum += arr[i].minutes_to(arr[i+1]);
    }       
    std::cout.fill('0');
    std::cout << sum / 60 << ':' << std::setw(2) << sum % 60;
    
    delete[] arr;
    
    return 0;
}
Конкретно проблема с этой функцией
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
inline int minutes_to(const TDate& date)
    {
        size_t count = 0;
        while (*this < date)
        {
            add_minutes(1);
            
            if (hour >= 18)
            {
                add_minutes(960); //если 18:00, то перехожу на 10:00
            }
            ++count;
        }
        return count + (hour >= 18) ;
    }
Она, очевидно, реализована неправильно, т.к. на первый же тест выдает неправильный ответ.
А именно на этот
Код
4
15.01. 17:00
16.01. 12:00
11.02. 14:00
30.01. 10:00
Должна выводить 130:02, а выводит 130:00.
Пробовал по разному извращаться, но тогда не работали другие тесты.
Например,
Код
2
20.11. 10:27
18.11. 15:13
Ответ: 1:15.
Или
Код
2 
28.02. 17:59 
01.03. 10:00
Ответ: 0:01
Где-то на поверхности лежит элементарное решение, до которого я не могу додуматься...
P.S. структура, вероятно, реализована тоже криво - до этого момента не пытался писать свои классы. Но скоро они мне понадобятся, так что начинаю с мелочей.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2011, 16:39     Подсчет количества минут от промежутка до промежутка без учета еще одного промежутка времени.
Посмотрите здесь:

C++ Расчет длительности в днях промежутка времени между двумя датами
C++ Получить все простые числа из промежутка
C++ продолжительность промежутка времени (в часах минутах секундах)
C++ Заданны моменты начала и конца некоторого промежутка времени в часах
выбор числа из промежутка с условием C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
02.08.2011, 18:30     Подсчет количества минут от промежутка до промежутка без учета еще одного промежутка времени. #2
Цитата Сообщение от diagon Посмотреть сообщение
Должна выводить 130:02, а выводит 130:00.
130 вместо 103 это опечатка?
Ну а что до 2 минут, то они минуту окончания тоже считают. То есть сколько интервалов, на столько и надо увеличить (на n/2)
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.08.2011, 18:42  [ТС]     Подсчет количества минут от промежутка до промежутка без учета еще одного промежутка времени. #3
Цитата Сообщение от grizlik78 Посмотреть сообщение
130 вместо 103 это опечатка?
да

Цитата Сообщение от grizlik78 Посмотреть сообщение
То есть сколько интервалов, на столько и надо увеличить (на n/2)
Точно.
Заменил 80 строку на
C++
1
return count + 1 ;
Accepted.
Сам пробовал также делать, но где-то в обсуждении нашел тесты с неверными ответами =)
Спасибо.

P.S. вроде friend - это же функция член, которая не является частью класса, но имеет доступ к его переменным.

У меня оператор >> вроде частью класса является, но компилируется, хотя в теле структуры написан.
LosAngeles
Заблокирован
02.08.2011, 19:02     Подсчет количества минут от промежутка до промежутка без учета еще одного промежутка времени. #4
у тебя же все данные публичные, не нужен тогда friend
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.08.2011, 19:08  [ТС]     Подсчет количества минут от промежутка до промежутка без учета еще одного промежутка времени. #5
Цитата Сообщение от LosAngeles Посмотреть сообщение
у тебя же все данные публичные, не нужен тогда friend
А без него не компилится =)

Ясно, спасибо.
LosAngeles
Заблокирован
02.08.2011, 19:11     Подсчет количества минут от промежутка до промежутка без учета еще одного промежутка времени. #6
почему оно не должно компилиться?
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
struct TDate{
        int day, month, hour, minute;
 
        inline static int day_in_month(int month)
        {
                switch (month)
                {
                        case 2:
                                return 28; //год точно невисокосный
                        case 1:         case 3:         case 5:
                        case 7:         case 8:         case 10:
                        case 12:
                                return 31;
                        default:
                                return 30;
                }
        }
 
 
 
        inline bool operator < (const TDate& a) const
        {
 
                if (month != a.month)
                        return month < a.month;
                if (day != a.day)
                        return day < a.day;
                if (hour != a.hour)
                        return hour < a.hour;
 
                return minute < a.minute;
        }
 
 
 
        inline TDate& add_minutes(int count)
        {
                minute += count;
                if (minute > 59)
                {
                        hour += minute / 60;
                        minute %= 60;
                }
                if (hour > 23)
                {
                        day += hour / 24;
                        hour %= 24;
                }
                while (day > day_in_month(month))
                {
                        day -= day_in_month(month);
                        ++month;
                }
                return *this;
        }
 
 
        inline int minutes_to(const TDate& date)
        {
                size_t count = 0;
                while (*this < date)
                {
                        add_minutes(1);
 
                        if (hour >= 18)
                        {
                                add_minutes(960);
                        }
                        ++count;
                }
                return count + (hour >= 18) ;
        }
 
};
 
 
inline std::istream& operator >> (std::istream& stream, TDate& date)
{
        char tmp;
        stream >> date.day >> tmp >> date.month >> tmp >> date.hour >> tmp >> date.minute;
        return stream;
}
 
int main(){
 
        //freopen("input.txt", "r", stdin);
        //freopen("output.txt", "w", stdout);
 
        unsigned n;
        std::cin >> n;
 
        TDate * arr = new TDate [n];
        for (size_t i = 0; i < n; ++i)
                std::cin >> arr[i];
 
        std::sort( arr, arr + n );
 
        long long sum = 0;
        for (size_t i = 0; i < n - 1; i += 2)
        {
                sum += arr[i].minutes_to(arr[i+1]);
        }
        std::cout.fill('0');
        std::cout << sum / 60 << ':' << std::setw(2) << sum % 60;
 
        delete[] arr;
 
        return 0;
}
Yandex
Объявления
02.08.2011, 19:11     Подсчет количества минут от промежутка до промежутка без учета еще одного промежутка времени.
Ответ Создать тему
Опции темы

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