제출 #1327494

#제출 시각아이디문제언어결과실행 시간메모리
1327494sh_qaxxorov_571Self Study (JOI22_ho_t2)C++20
100 / 100
96 ms5120 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long ll;

/**
 * JOI 2021/2022 Final Round - Task 2
 * Mantık: Minimum kavrama düzeyini X yapmak için gereken toplam ders saatini hesapla.
 * Eğer toplam saat <= N * M ise X değeri ulaşılabilir bir değerdir.
 */

bool check(ll mid, int N, ll M, const vector<ll>& A, const vector<ll>& B) {
    ll total_needed_hours = 0;
    ll total_available_hours = N * M;

    for (int i = 0; i < N; i++) {
        ll current_needed = 0;
        
        // Bu ders için en verimli çalışma biçimini seç (Kendi dersine girmek vs Bireysel çalışmak)
        ll best_per_hour = max(A[i], B[i]);
        
        // Eğer hedef X (mid), sadece en iyi verimle M saatte tamamlanabiliyorsa
        if (mid <= best_per_hour * M) {
            // Sadece bu ders için ayrılan sürelerde (veya daha azında) hedefe ulaşabiliriz
            current_needed = (mid + best_per_hour - 1) / best_per_hour;
        } else {
            // Kendi ders saatleri (M) yetmiyor, ek olarak B[i] verimiyle ekstra saat lazım
            ll remaining_score = mid - (best_per_hour * M);
            current_needed = M + (remaining_score + B[i] - 1) / B[i];
        }
        
        total_needed_hours += current_needed;
        
        // Taşma kontrolü ve erken çıkış
        if (total_needed_hours > total_available_hours) return false;
    }

    return total_needed_hours <= total_available_hours;
}

int main() {
    // Giriş hızlandırma
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    ll M;
    if (!(cin >> N >> M)) return 0;

    vector<ll> A(N), B(N);
    for (int i = 0; i < N; i++) cin >> A[i];
    for (int i = 0; i < N; i++) cin >> B[i];

    // İkili arama aralığı: [0, max_possible_score]
    ll low = 0, high = 2e18; // 1e9 * 1e9 civarı bir üst sınır
    ll ans = 0;

    while (low <= high) {
        ll mid = low + (high - low) / 2;
        if (mid == 0) {
            low = mid + 1;
            continue;
        }
        
        if (check(mid, N, M, A, B)) {
            ans = mid;
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

    cout << ans << endl;

    return 0;
}
#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...