Cod sursa(job #2100923)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 6 ianuarie 2018 16:14:43
Problema Transport Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.21 kb
//
//  main.c
//  transport
//
//  Created by Abel Hiticas on 06/01/2018.
//  Copyright © 2018 Abel Hiticas. All rights reserved.
//

#include <stdio.h>


int v[16001], n, k, maxi=0, total=0;

int check(int capacity){
    int i=0, sum=0, cnt=0;
    
    for(i=0; i<n; i++){
        if(sum+v[i] <= capacity){
            sum+=v[i];
        } else {
            cnt++;
            sum=v[i];
        }
    }
    if (sum!=0)
        cnt++;
    return cnt;
}

int bs(int st, int dr) {
    
    int val=1, mij=0;
    while (st <= dr) {
        mij = (st+dr)/2;
        
        val = check(mij);
        if(val==k){
            if (check(mij-1) >k)
                return mij;
            else
                dr=mij-1;
        }
            
        if(val>k)
            st=mij+1;
        else
            dr=mij-1;
    }
    
    return mij;
}


int main(int argc, const char * argv[]) {
    // insert code here...
    int i=0;
    freopen("transport.in","r",stdin);
    freopen("transport.out", "w", stdout);
    scanf("%d %d", &n, &k);
    for(i=0; i<n; i++) {
        scanf("%d", &v[i]);
        total+=v[i];
        if (v[i]>maxi) {
            maxi = v[i];
        }
    }
    
    printf("%d", bs(maxi, total));
    
    return 0;
}