Cod sursa(job #987244)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 20 august 2013 12:18:37
Problema Transport Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <stdio.h>
#include <fstream>
#define MAX_N 16001
using namespace std;
int v[MAX_N],n,k;
long long int answer=MAX_N,l,r;
ofstream out("transport.out");
int maxim(int a, int b)
{
    if(a<b) return b;
    return a;
}
int minim(long long int a, long long int b)
{
    if(a<b) return a;
    return b;
}
void citire()
{
    freopen("transport.in", "r", stdin);
    scanf("%d %d",&n, &k);
    int i;
    for(i=1; i<=n; i++)
    {
        scanf("%d",&v[i]);
        l=maxim(l,v[i]);
        r+=v[i];
    }

}
int numar_curent_transporturi(int capacity)
{
    int cs=capacity, answer=0,i;

    for(i=1; i<=n; i++)
    {
        if(v[i]<=cs)  cs-=v[i];
        else
        {
            answer++,cs=capacity;
            cs-=v[i];
        }
    }
    if(cs>0) return answer+1;
    else return answer;
}
void cautare_binara(int left, int right)
{
    //out<<left<<' '<<right<<endl;
    if(left<=right)
    {
        int m=(left+right)/2,current_value;

        current_value=numar_curent_transporturi(m);

        if(current_value<=k)
        {
            answer=minim(answer,m);
            cautare_binara(left,m-1);
        }
        else cautare_binara(m+1,right);
    }

}
int main()
{
    citire();
    cautare_binara(1,r);
    out<<answer;
    return 0;
}