Pagini recente » Cod sursa (job #647477) | Cod sursa (job #2037806) | Cod sursa (job #3219300) | Clasament 20101 | Cod sursa (job #3297035)
#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;
}