Solução: Problema da fragmentação de memória (Marcus Vinícius)

From AdonaiMedrado.Pro.Br
Jump to: navigation, search
using System;
 
namespace aula3problema2
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			Memoria mem = new Memoria(int.Parse(Console.ReadLine()));
 
			int numAlocacoes = int.Parse(Console.ReadLine());			
			if(numAlocacoes > 0)
			{
				int[] pedidos = new int[numAlocacoes];
				for(int i = 0; i < numAlocacoes; i++)
				{
					pedidos[i] = int.Parse(Console.ReadLine());
				}
				mem.alocarMemoria(pedidos);
			}
 
			int numDesalocacoes = int.Parse(Console.ReadLine());
			if(numDesalocacoes > 0)
			{
				int[] desalocacoes = new int[numDesalocacoes];
				for(int i = 0; i < numDesalocacoes; i++)
				{
					desalocacoes[i] = int.Parse(Console.ReadLine());
				}		
				mem.desalocarMemoria(desalocacoes);
			}			
			Console.WriteLine(mem.obterMaiorArea());		
		}
	}
}
 
using System;
 
namespace aula3problema2
{
 
 
	public class Memoria
	{
 
		private int[][] alocacao;
 
		private int tamanho;
 
		private int ultimo;
 
		public Memoria(int tamanho)
		{		
			this.tamanho = tamanho;
			ultimo = -1;
		}
 
		public void alocarMemoria(int[] pedidos){
			int numeroPedidos = pedidos.GetUpperBound(0)+1;
			alocacao = new int[numeroPedidos][];
 
			for(int i = 0; i < numeroPedidos; i++)
			{
				alocaPedido(pedidos[i]);
			}		
		}
 
		private void alocaPedido(int pedido)
		{
			int inicio,fim;
			if (alocacao[0] == null)
			{
				inicio = 0;
				fim = pedido;
			}
			else
			{
				inicio = alocacao[ultimo][1];
				fim = inicio + pedido;
			}
 
 
			if(pedido + inicio <= tamanho)
			{
				alocacao[ultimo+1] = new int[2];
				alocacao[ultimo+1][0] = inicio;
				alocacao[ultimo+1][1] = fim;
				ultimo++;
			}
		}
 
		public void desalocarMemoria(int[] indices)
		{
			foreach(int indice in indices)
			{
				alocacao[indice] = null;
			}
		}
 
 
		public int obterMaiorArea()
		{
			int maiorEspaco = 0;
			int ponteiroMem = 0;
			foreach(int[] aloca in alocacao)
			{
				if(aloca != null)
				{
					if(aloca[0] - ponteiroMem > maiorEspaco)
						maiorEspaco = aloca[0] - ponteiroMem; 
					ponteiroMem = aloca[1];
				}
			}
			if(tamanho - ponteiroMem > maiorEspaco)
					maiorEspaco = tamanho - ponteiroMem; 
			return maiorEspaco;
		}
	}
}