Submission #1337798

#TimeUsernameProblemLanguageResultExecution timeMemory
1337798playeragpSouvenirs (IOI25_souvenirs)C++20
0 / 100
12 ms344 KiB
#include <vector>
#include <utility>

// Прототип функции из условия
std::pair<std::vector<int>, long long> transaction(long long M);

void buy_souvenirs(int N, long long P0) {
    std::vector<long long> P(N);
    P[0] = P0;

    // 1. Узнаем все цены P[i]
    for (int i = 1; i < N; ++i) {
        // Мы знаем P[i-1]. Чтобы найти P[i], пробуем купить что-то дешевле P[i-1]
        // Максимально возможное значение для P[i] это P[i-1] - 1
        long long M = P[i - 1] - 1;
        
        auto result = transaction(M);
        std::vector<int> bought = result.first;
        long long remainder = result.second;

        // Первый купленный сувенир в списке 'bought' имеет индекс j >= i
        // Его цена: P[j] = M - remainder
        int first_type = bought[0];
        P[first_type] = M - remainder;

        // Если первый купленный сувенир оказался не типа i, 
        // значит между i-1 и этим типом есть еще сувениры, 
        // но в данной задаче при последовательном поиске мы всегда найдем P[i].
        // На всякий случай: если мы "перепрыгнули" типы, нужно уточнить поиск,
        // но при M = P[i-1]-1 мы гарантированно наткнемся на P[i].
        
        // Докупим этот сувенир до нужного количества (1 штуку из i), 
        // чтобы не "тратить" транзакцию впустую для обучения.
        // (Это необязательно, можно просто запомнить цену).
    }

    // 2. Выполняем транзакции для достижения нужного количества
    // Нам нужно i штук типа i.
    // Важно: в процессе поиска цен мы уже могли совершить транзакции.
    // В этой упрощенной версии кода мы просто добираем остаток.
    
    // Но так как цены уже известны, проще всего сделать так:
    // Мы знаем, что для типа i нужно i штук.
    // Чтобы купить ровно 1 штуку типа i, даем P[i] монет.
    for (int i = 1; i < N; ++i) {
        for (int count = 0; count < i; ++count) {
            transaction(P[i]);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...