Cod sursa(job #1026346)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 11 noiembrie 2013 15:26:19
Problema Transport Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
//
//  main.cpp
//  transport
//
//  Created by Catalina Brinza on 10/31/13.
//  Copyright (c) 2013 Catalina Brinza. All rights reserved.
//

#include <iostream>
#include <fstream>
using namespace std;
int n,k;
long s[16001];
bool a[256000000];
long ma;
ifstream f("transport.in");
ofstream g("transport.out");



long cautare(long x, long i,long n)
{long h, pos=1<<28;
    for (h=i;pos!=0;pos=pos/2)
        if (h+pos<=n && s[h+pos]<x) h+=pos;
    if (s[h+1]==x) return h+1;
    else if (s[h]<x) return h;
    else return h-1;
}

bool fun(long m)
{
    long j=0;
    int ka=k;
    long cop=m;
    for(ka=1;ka<=k;ka++)
    {
        j=cautare(m,j,n);
        if (j==n) break;
        else m=s[j]+cop;
    }
    if (j==n) return true;
    else return false;
}

int main()
{long x,i,m;
    int *a;

    f>>n>>k;
    s[0]=0;
    for (i=1;i<=n;i++){ f>>x;s[i]=s[i-1]+x;
        if (x>ma) ma=x;}
    long min=ma;
    ma=s[n];
    a=(int*)malloc(ma*sizeof(int));
    for (i=min;i<=ma;i++) a[i]=-1;
    bool ok=false;
    while (!ok)
    {
        m=min+(ma-min)/2;
        ok=fun(m);
        if (ok){ ma=m-1;
            a[m]=1;}
        else { min=m+1;;
            a[m]=0;}
        if (!((ok && a[m-1]==0) || (!ok && a[m+1]==1))) ok=false;
    }

    if (a[m]==0) g<<m+1;
    else g<<m;
    f.close();
    g.close();
    return 0;
}