Cod sursa(job #410952)

Utilizator savimSerban Andrei Stan savim Data 4 martie 2010 17:35:12
Problema Grupuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>
#include <string.h>

#define MAX_N 100001

char s[8 * MAX_N], *p;

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

inline int read_value() {
	int ret = 0;
	while ('0' <= *p && *p <= '9')
		ret = ret * 10 + *(p++) - '0';
	p++;
	
	return ret;
}

int main() {

	freopen("grupuri.in", "r", stdin);
	freopen("grupuri.out", "w", stdout);
	
	scanf("%d %d\n", &m, &n);
	fgets(s, sizeof(s), stdin); p = s;
	
	for (int i = 1; i <= n; i++) {
		A[i] = read_value();
		dr += A[i];
	}
	
	st = 0; dr = dr / m + 1; mid = 0;
	while (st + 1 < dr) {
		mid = (st + dr) / 2;
		
		poz = 1; k = 0;
		for (int i = 1; i <= n; i++)
			if (k < mid) {
				v = A[i];
				
				long long d = mid - k;
				if (d <= v) {
					k = mid; v -= d; 
					if (++poz > m) break;
					k = (v < mid - d) ? v : mid - d;
				}
				else k += v;
			}
		
		if (poz >= m && k == mid) {
			sol = (sol > mid) ? sol : mid;
			st = mid;
		}
		else dr = mid;
	}
	
	printf("%lld\n", sol);
	
	return 0;
}