Cod sursa(job #1797655)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 4 noiembrie 2016 18:07:37
Problema Transport Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <limits.h>
#define MAXN 16001
int v[MAXN];

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

    int k1 = 1 , i , x1 = x;

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

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

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

    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 = (left + right) / 2;
        if(check(x , n , k)){


                min = x;

          /*  if(check(x - 1, n , k) == 1 && (x - 1) < min)
            min = x - 1;
*/
            right = x - 1;
            }
            else{
                left = x + 1;
               /* if(check(left , n , k) == 1 && left < min)
                    min = left;*/

                }
    }
    if(n == 1)
        fprintf(g,"%d",max);
        else
        if(k == 1)
        fprintf(g,"%d",sum);
    else
    fprintf(g,"%d",min);




}