Pagini recente » Cod sursa (job #782129) | Cod sursa (job #415635) | Cod sursa (job #2023607) | Monitorul de evaluare | Cod sursa (job #410895)
Cod sursa(job #410895)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX_N 100010
int n, m;
long long A[MAX_N], v[MAX_N];
long long nr[MAX_N], st, dr, mid, sol, poz;
int main() {
freopen("grupuri.in", "r", stdin);
freopen("grupuri.out", "w", stdout);
scanf("%d %d", &m, &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &A[i]);
dr += A[i];
}
st = 0; dr++; mid = 0;
while (st + 1 < dr) {
mid = (st + dr) / 2;
for (int i = 1; i <= n; i++) {
v[i] = A[i];
nr[i] = 0;
}
poz = 1;
for (int i = 1; i <= n; i++)
if (nr[poz] < mid) {
long long d = mid - nr[poz];
if (d <= v[i]) {
nr[poz] = mid; v[i] -= d;
nr[++poz] = min(mid, min(v[i], mid - d));
}
else nr[poz] += v[i];
if (poz > m) {
poz--;
break;
}
}
if (poz == m && nr[poz] == mid) {
sol = max(sol, mid);
st = mid;
}
else dr = mid;
}
printf("%lld\n", sol);
return 0;
}