Submission #1189241

#TimeUsernameProblemLanguageResultExecution timeMemory
1189241Zakir060Stove (JOI18_stove)C++20
100 / 100
12 ms1864 KiB
#include <iostream>
#include <vector>
#include <algorithm> // sort üçün
#include <numeric>   // accumulate üçün (alternativ)

int main() {
    // Giriş/çıxışı sürətləndirmək üçün (böyük N üçün vacib ola bilər)
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    int n;
    long long k; // K də N qədər böyük ola bilər
    std::cin >> n >> k;

    // Əgər hər qonaq üçün kifayət qədər kibritimiz varsa
    if (k >= n) {
        std::cout << n << std::endl;
        return 0;
    }

    // Qonaqların gəliş vaxtları (böyük ola bilər)
    std::vector<long long> t(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> t[i];
    }

    // Qonaqlar arasındakı boşluqların uzunluqları
    std::vector<long long> gaps;
    // N-1 boşluq olacağı üçün yer ayırmaq performansı artıra bilər
    gaps.reserve(n - 1);
    for (int i = 0; i < n - 1; ++i) {
        // Növbəti qonağın gəlişi - Hazırkı qonağın gedişi
        long long gap_length = t[i + 1] - (t[i] + 1);
        // Məsələnin şərtinə görə Ti < Ti+1, yəni T[i+1] >= T[i] + 1,
        // buna görə gap_length həmişə >= 0 olmalıdır.
        gaps.push_back(gap_length);
    }

    // Boşluqları artan sırada çeşidləyirik ki, ən kiçikləri seçə bilək
    std::sort(gaps.begin(), gaps.end());

    // Başlanğıc minimal işləmə müddəti (hər qonaq üçün 1 vahid)
    long long total_time = n;

    // Birləşdirməli olduğumuz (kibritə qənaət etmək üçün) boşluqların sayı
    long long num_gaps_to_bridge = n - k;

    // Ən kiçik 'num_gaps_to_bridge' sayda boşluğun uzunluğunu ümumi vaxta əlavə edirik
    for (long long i = 0; i < num_gaps_to_bridge; ++i) {
        // Əmin olmaq üçün ki, kifayət qədər boşluq var (n > k və n > 1 şərti ilə həmişə doğrudur)
        if (i < gaps.size()) {
            total_time += gaps[i];
        } else {
             // Bu hal n=1 və k<n (mümkün deyil) və ya n>1, k<n hallarında baş verməməlidir.
            break;
        }
    }

    /* Alternativ olaraq std::accumulate ilə:
    if (num_gaps_to_bridge > 0 && !gaps.empty()) {
        // C++11 və sonrası: Başlanğıc dəyər üçün 0LL istifadə edərək long long toplamanı təmin edin
        total_time += std::accumulate(gaps.begin(),
                                      gaps.begin() + std::min((long long)gaps.size(), num_gaps_to_bridge),
                                      0LL);
    }
    */

    std::cout << total_time << std::endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...