Cod sursa(job #1797132)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 3 noiembrie 2016 23:49:23
Problema Transport Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <limits.h>
#define MAXN 16001
int v[MAXN];

    int cautareBinara(int x , int n , int i , int j){
    int k;
   // printf("%d %d\n",i,j);
    while(i < j){

        k = (i + j) / 2;

        if(x < k)
            j = k - 1;
        else
        if(x > k)
            i = k + 1;
        else
        return k;
    }
    }

    int check(int x , int n , int k){

    int k1 = 0 , i , x1 = x;

    for(i = 1;i <= n; ++i){

        if(x1 - v[i] >= 0)
            x1 = x1 - v[i];
            else
            {
                ++k1;
                x1 = x;
                x1 = x1 - v[i];
            }

        if(x1 == 0){
            ++k1;
            x1 = x;
        }

    }
    if(x1 < x)
        ++k1;

    if(k1 <= k)
        return 1;
        return 0;

}

int main()

{
    int i , k , n , sum = 0 , left , right , x , min = INT_MAX , max = 0;

    FILE *f,*g;

    f=fopen("transport.in","r");
    g=fopen("transport.out","w+");

    fscanf(f,"%d %d",&n,&k);

    for(i = 1;i <= n; ++i){

        fscanf(f,"%d",&v[i]);
        sum = sum + v[i];
        if(v[i] > max)
            max = v[i];

    }

    left = max;
    right = sum;


    while(left < right){

        x = cautareBinara((left + right) / 2 , n , left , right);
        if(check(x , n , k)){

            if(x < min)
                min = x;

            if(check(x - 1, n , k) == 1)
            min = x - 1;

            right = x - 1;
            }
            else{

                left = x + 1;
                if(check(left,n,k) == 1)
                    min = left;

            }
    }

    fprintf(g,"%d",min);




}