Cod sursa(job #1383868)

Utilizator karlaKarla Maria karla Data 10 martie 2015 18:38:43
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>

using namespace std;

FILE*f=fopen("transport.in","r"),*g=fopen("transport.out","w");
int v[16030], s = 0, n, k;

int carat(int x)
{
    int s = 0, nr = k, i;
    for(i = 1; i <= n; i++)
    {
        if(nr == 0) break;
        if(s + v[i] > x)
        {
            s = v[i];
            nr --;
        }
        else s += v[i];
    }
    if(nr > 0)
        return 1;
    return 0;
}

int main()
{
    int maxim = 0;
    fscanf(f,"%d %d\n",&n,&k);
    for(int i = 1; i <= n; i++)
    {
        fscanf(f,"%d\n",&v[i]);
        s += v[i];
        if(v[i] > maxim)
            maxim = v[i];
    }
    if(k == 1)
        fprintf(g,"%d\n",s);
    else if(k == n)
        fprintf(g,"%d\n",maxim);
    else
    {
        int p = 1, u = s, mij;
        while(p <= u)
        {
            mij = (p+u) / 2;
            int sol = carat(mij);
            if(sol == 1)
            {
                u = mij - 1;
            }
            else{
                p = mij + 1;
            }
        }
        fprintf(g,"%d\n",p);
    }

    return 0;
}