Пожалуйста, прочтите новое правило об ограничении использования AI-инструментов. ×

Блог пользователя PylyaoTBabyliUltraNysha

Автор PylyaoTBabyliUltraNysha, история, 15 месяцев назад, По-русски

Всем привет. Мне нужна помощь з задачей. Я не знаю как ускорить свой тупой перебор . Вот условие задачи :"Русский бизнесмен Иван Петров закупил в Китае большую партию наручных часов, чтобы продать их на родине за полцены (т.е. в 5 раз дороже, чем они стоили в Китае). Иван столкнулся с проблемой: китайские часы оказались некачественными. Мало того, что часы работали на протяжении всего нескольких часов, пока их не стукнешь, так еще и время подводить неудобно: вращать можно не минутную, а только секундную стрелку, причем, что самое ужасное, только в одну сторону в направлении увеличении времени. Например, для того, чтобы подвести часы на секунду назад, необходимо было сделать более 700 полных оборотов секундной стрелки, на что Иван бы потратил более 10 минут.

Чтобы продать эти часы оптом Ивану необходимо на момент сделки создать видимость того, что часы исправны. Для этого он собирается остановить все часы, установить их на одно и то же время. А перед сделкой ударить по чемодану с часами, чтобы они все дружно пошли.

Помогите Ивану выяснить: какое время на часах лучше установить для того, чтобы Иван потратил как можно меньше времени для того, чтобы подвести все часы.

Входные данные В первой строке входного файла INPUT.TXT содержится натуральное число N – количество часов (N ≤ 50000). В последующих N строках располагаются показания всех часов в формате h:mm:ss, где h – показывает который час, mm – минуты, ss — секунды (1 ≤ h ≤ 12, 0 ≤ mm ≤ 59, 0 ≤ ss ≤ 59).

Выходные данные Выходной файл OUTPUT.TXT должен содержать время, которое нужно установить на всех часах, в формате, указанном выше. В случае неоднозначного ответа выведите наименьшее время." Тест 3 8:19:16 2:05:11 12:50:07 Ответ на Тест 2:05:11 :"https://acmp.ru/asp/do/index.asp?main=task&id_course=2&id_section=15&id_topic=18&id_problem=94" Вот тупой перебор

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
 
int main() {
    ll n;
    cin >> n;
    vector<ll> times(n);
    for (int i = 0; i < n; i++) {
        ll x, y, z;
        char c;
        cin >> x >> c >> y >> c >> z;
        times[i] = x * 3600 + y * 60 + z;
    }
 
    ll min_sum = 1e18, ans_time = 0;
    for (int i = 0; i < n; i++) {
        ll sum = 0;
        for (int j = 0; j < n; j++) {
            if (times[j] <= times[i]) {
                sum += times[i] - times[j];
            } else {
                sum += times[i] + 12 * 3600 - times[j];
            }
        }
        if (sum < min_sum) {
            min_sum = sum;
            ans_time = times[i];
        }
    }
 
    if (ans_time == 0) ans_time = 12 * 3600;
    printf("%d:%02d:%02d\n", ans_time / 3600, ans_time % 3600 / 60, ans_time % 60);
}
  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

»
15 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Заметим, что нам выгодно перемещать время всех часов на какое-то из времён этих китайских часов
Будем хранить Map. Ключ = время, значение = количество китайских часов с таким временем. Отсортируем массив по времени на часах в порядке невозрастания. Пусть массив стал a1, a2, ..., an. Далее найдем ответ, если переводим время на наибольшее значение из китайских часов. Тогда попробудем перевести время на a2. Ответ увеличится на x * 12 часов, x = m[a1], а уменьшится на n * (a1 - a2). Так для каждого перевода времени на ai посчитаем ответ и выберем наименьший.
Итоговая ассимптотика = O(n log n)