Solução: Problema da fragmentação de memória (Marcus Vinícius)
From AdonaiMedrado.Pro.Br
Revision as of 23:52, 7 April 2009 by 200.17.147.2 (Talk) (New page: <code lang="csharp"> using System; namespace aula3problema2 { class MainClass { public static void Main(string[] args) { Memoria mem = new Memoria(int.Parse(Console.ReadLine()))...)
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; } } }