fbpx

Problema #2252 – Profu – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Alex este un copil destul de bun la informatica însă are un defect: Poate fi foarte enervant(prin enervant se înțelege ca își stresează profesorii cu mesaje pe Messenger). Profesorul de informatica s-a săturat de această situație așa ca i-a spus lui Alex ca dacă nu rezolvă următoarea problema îl va bloca pe Messenger. Alex nu vrea sa se întâmple acest lucru deoarece așa e conștient ca nu va mai avea pe cine stresa. Problema sună așa:

Avem n cutii așezate într-o stivă astfel încât avem acces doar la prima cutie.Pentru fiecare cutie sa știe un număr A[i] reprezentând volumul cutiei i = 1,2...,n. Aceste cutii trebuie transportate din localitatea A în localitatea B știind ca se pot efectua maxim k transporturi (în cazul în care s-ar efectua mai multe mașina ar rămâne fără combustibil) și de asemenea fiind o mașina închiriată trebuie sa aibă capacitatea minimă x necesară pentru a efectua cele k transporturi. Numărul x este cel ce îi dă bătăi de cap lui Alex așa ca el vă roagă să îl ajutați!

Date de intrare

Pe prima linie a fișierului profu.in se vor găsi cele doua numere n și k cu semnificația din enunț apoi pe a doua linie a fișierului se vor găsi n numere naturale.

Date de ieșire

Fișierul de ieșire profu.out va conține pe prima linie numărul x, reprezentând capacitatea minima a mașini ce trebuie închiriată.

Restricții și precizări

  • 1 ≤ n ≤ 500.000
  • numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000

Exemplu

profu.in

6 3
7 3 2 3 1 4

profu.out

8

Explicație

La primul transport este încărcată prima saltea (care are volumul 7). La cel de-al doilea transport sunt încărcate saltele 2 și 3 (volumul total este 3 + 2 = 5). La cel de-al treilea transport sunt încărcate saltele 4, 5 și 6 (volumul total este 3 + 1 + 4 = 8 fiind cel mai mic rezultat posibil)

#include <bits/stdc++.h>

using namespace std;
ifstream cin("profu.in");
ofstream cout("profu.out");
int a[500001] , k , n;

int poate(int a[] , int n , long long x , int k)
{
    long long s = 0;
    int c = 1;
    for(int i = 1 ; i <= n ; i++)
    {
        s += a[i];
        if(s > x)
        {
            c++;
            if(c > k) return 0;
            s = a[i];
        }
    }
    if(c <= k) return 1;
    else return 0;
}

long long cautarebinara(int a[] , int n , int max , long long x , int k)
{
    long long st = max , dr = x;
    while(st <= dr)
    {
        long long mij = (st+ dr) / 2;
        if(poate(a , n , mij , k)) dr = mij-1;
        else st = mij+1;
    }
    return st;
}
int main()
{
    long long x = 0;
    int max = 0;
    cin >> n >> k;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> a[i];
        x += a[i];
        if(a[i] > max) max = a[i];
    }
    cout << cautarebinara(a , n , max , x , k);
}
Comentarii

S-ar putea sa iti placa