Cod sursa(job #3331612)

Utilizator alexiam5656Alexia Mitrache alexiam5656 Data 29 decembrie 2025 14:11:37
Problema Transport Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
/******************************************************************************

                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <stdio.h>
#include <stdlib.h>

int verifica(int cap, int n, int k, int *volume) {
    int transporturi = 1;
    int suma_curenta = 0;

    for (int i = 0; i < n; i++) {
    
        if (volume[i] > cap) return 0;

        if (suma_curenta + volume[i] <= cap) {
            suma_curenta += volume[i];
        } else {
            
            transporturi++;
            suma_curenta = volume[i];
        }
    }

   
    return transporturi <= k;
}

int main() {
    FILE *fin = fopen("transport.in", "r");
    FILE *fout = fopen("transport.out", "w");
    int n, k;
    fscanf(fin, "%d %d", &n, &k);
    int *volume = (int *)malloc(n * sizeof(int));
    int max_vol = 0;
    long long suma_totala = 0;

    for (int i = 0; i < n; i++) {
        fscanf(fin, "%d", &volume[i]);
        if (volume[i] > max_vol) 
        {
            max_vol = volume[i];
        }
        suma_totala = suma_totala + volume[i];
    }
    int stanga = max_vol;
    int dreapta = (int)suma_totala;
    int ans = (int)suma_totala;

    while (stanga <= dreapta) {
        int mid = (dreapta + stanga) / 2;
        if (verifica(mid, n, k, volume)) 
        {
            ans = mid;         
            dreapta = mid - 1;
        } else {
            stanga = mid + 1; 
        }
    }

    fprintf(fout, "%d\n", ans);
    free(volume);
    fclose(fin);
    fclose(fout);

    return 0;
}