Cod sursa(job #339625)

Utilizator sigridMaria Stanciu sigrid Data 10 august 2009 17:35:02
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<stdio.h>
#define dim 16001

int v[dim];

int N, K, sum;

int greedy(int C)
{
    int i = 1, suma = 0, cont = 0;

    while(i <= N)
    {
	  while( (suma < C) && (i <= N) )
	  {
	       suma = suma + v[i];
	       i++;
	  }
	  if(suma > C) {suma = 0; i--; cont++;}
		  else if(suma == C) {suma = 0; cont++;}
			else cont++;
    }
    
    return cont;
}

int caut(int li, int ls)
{
    int jum;
    
    jum = ( li + ls ) / 2;
    
    while(li < ls)
    {
             if( greedy(jum) > K )  li = jum + 1;
                 else ls = jum;
                 
             jum = ( li + ls ) / 2;
    }
    
    return jum;
}

int main()
{
    int i, max = 0;

    freopen("transport.in", "r", stdin);
    freopen("transport.out", "w", stdout);

    scanf("%d %d", &N, &K);

    for(i = 1; i <= N; i++)
    {
	  scanf("%d", &v[i]);
	  sum = sum + v[i];
	  if(v[i] > max) max = v[i];
    }

    if( K == 1 )
    {
        printf("%d\n", sum);
        return 0;
    }
    
    i = caut(max, sum);
    printf("%d\n", i);    
    
    return 0;
}