Cod sursa(job #3297035)

Utilizator luca.rares.andreiLuca Rares Andrei luca.rares.andrei Data 20 mai 2025 15:46:32
Problema Transport Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
ifstream cin("transport.in");
ofstream cout("transport.out");
int n, k;
int v[100001];

struct Copil{
    int suma, l, r, ord;
};

bool check(int sum){
    int s = 0, cnt=0;
    for(int i=0; i<n; i++){
        if(s < sum)
            s += v[i];
        else {s = v[i]; cnt++;}
    }
    if(s >= sum)
        {cnt++;}
    if(cnt < k)
        return 0;
    return 1;
}

bool cmp(Copil a, Copil b){
    if(a.suma == b.suma) return a.l < b.l;
    return a.suma < b.suma;
}

bool sortLeft(Copil a, Copil b){
    return a.l < b.l;
}

int main()
{
    vector<Copil> m;
    int s =0, ll=0, i=0, cnt=0;
    int sum=0;

    cin>>n>>k;
    for(int i=0; i<n; i++){
        cin>>v[i];
        sum += v[i];
    }

    int l=0, r=sum+1;
    while(l<r){
        int mid = (l+r+1) / 2;
        if(check(mid) == true)
            l = mid ;
            else r = mid-1;
    }
    cout<<r<<endl;

    //distribute children
    r--;
    while(i < n){
        if(cnt == k-1){ //ultimul copil trebuie tratat diferit
            s = 0;
            while(i<n)
                s += v[i++];
        }
        while(i<n && s+v[i] < r){ //pentru formarea grupa noua
            s += v[i];
            i++;
        }
        if(i<n){   //aici adaugam si ultimul element la grupa respectiva
            s += v[i];
            i++;
        }

        cnt++;
        m.push_back({s, ll, i-1}); //adaugam grupa cu suma si intervale
        s = 0;
        ll = i;
    }

    //sort after sum
    sort(m.begin(), m.end(), cmp);

    //declare each child's id
    for(i=0; i<m.size(); i++)
        m[i].ord = k-i;

    //sort again like original input
    sort(m.begin(), m.end(), sortLeft);

    for(i=0; i<m.size(); i++)
        cout<<m[i].ord<<" "<<m[i].r-m[i].l+1<<'\n';

   return 0;
}