Cod sursa(job #1122682)

Utilizator horatiu13Horatiu horatiu13 Data 25 februarie 2014 19:52:18
Problema Grupuri Scor 6
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#define Nmax 100005
using namespace std;

FILE *fi = fopen("grupuri.in", "r");
FILE *fo = fopen("grupuri.out", "w");

int n;
int k;
int v[Nmax];
int ct = 0;
int sol = 0;
int poz;

void citire()
{
	fscanf(fi, "%d%d", &k, &n);
	for (int i = 1; i<=n; i++)
	{
		fscanf(fi, "%d", &v[n-i+1]);
		if (v[n-i+1] > 0) ct++;
	}
}

void sortare()
{
	int poz2 = k+1;
	if (v[k+2] == v[k+1])
		for (poz2 = k+2; poz2<=n && v[poz2] == v[k+1]; poz2++);
	
	if (k - poz + 1 == poz2 - k)
	{
		for (int i = poz; i <= k; i++) v[i]++;
		for (int i = k+1; i <= poz2; i++) v[i]--;
	}
	else if (k - poz + 1 > poz2 - k)
	{
		for (int i = poz; i<= poz + poz2 - k - 1; i++) v[i]++;
		for (int i = k+1; i<=poz2; i++) v[i]--;
	}
	else if (k - poz + 1 < poz2 - k)
	{
		for (int i = poz; i<=k; i++) v[i]++;
		for (int i = poz2 + poz - k; i<=poz2; i++) v[i]--;
	}
	
}

void rezolvare()
{
	int prima;
	while (ct >= k)
	{
		sol++;
		prima = 1;
		for (int i = 1; i<=k; i++) 
		{
			v[i]--;
			if (v[i] < v[k+1] && prima)
			{
				poz = i;
				prima--;
			}
			if (!v[i])
				ct--;
		}
		
		
		if (v[k] < v[k+1])	sortare();
	}
	
}

int main()
{
	citire();
	rezolvare();
	fprintf(fo, "%d", sol);
	return 0;
}