Cod sursa(job #1415864)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 6 aprilie 2015 18:17:57
Problema Transport Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <cstdio>
#define NM 16005

using namespace std;

int n, k, i, mx, v[NM];
int mid, sum, be, en;

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

bool verif(int x)
{
    verif1(x);
    if (verif1(x)>=k)
      return true;
    else
      return false;
}

int cautbin()
{
    be=max(sum, mx);
    en=NM*NM;
    int ans = NM*NM+1;
    while (be<=en)
    {
        mid=(be+en) / 2;
        if (verif(mid)==true)
        {
            if (verif1(mid)>k)
              be=mid+1;
            else
            {
                en=mid-1;
                ans=mid;
            }
        }
        else
          en=mid-1;
    }
    return ans;
}

int main()
{
    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]);
        mx=max(mx, v[i]);
        sum+=v[i];
    }
    sum/=k;
    if (max(sum, mx)>k)
      printf("%d\n", cautbin());
    else
      printf("%d\n", max(sum, mx));
    return 0;
}