Cod sursa(job #410878)

Utilizator savimSerban Andrei Stan savim Data 4 martie 2010 17:16:25
Problema Grupuri Scor 32
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define MAX_N 100010

int n, m, poz;
int A[MAX_N], v[MAX_N];
long long nr[MAX_N], st, dr, mid, sol;

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("%d", &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, 1LL * v[i]);
				}
				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;
}