Solução Pizza

Solução por Lucca Siaudzionis

Este é um problema conhecido de algoritmos gulosos. Imagine que, em vez de o array que representa a pizza ser cíclico, ele seja linear. Ou seja, temos um array de vários número inteiros e queremos o sub-array de maior soma. Neste caso, mantemos uma variável soma, inicialmente zerada, e percorremos o array, sempre acrescentando o valor da casa que estamos a variável soma. Quando tivermos soma < 0, resetamos soma para soma = 0.

Agora, para transformamos esta solução para resolver o problema Pizza, temos que fazer duas alterações:

  • duplicar nosso array ("copiando" o mesmo array ao lado do original)
  • além de checar se soma < 0, também precisamos checar se já não acrescentamos mais que N valores a variável soma.

O código, então, fica assim:


//
// pizza.cpp
// programas2
//
// Created by Lucca Siaudzionis on 03/01/13.
// Copyright (c) 2013 Luccasiau. All rights reserved.
//
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define max(A,B) (A)>(B)?(A):(B)
#define MAXN 200010
int main(){
int n;
int myv[MAXN];
memset(myv,0,sizeof myv);
scanf("%d",&n);
for(int i = 1;i<=n;i++){
scanf("%d",&myv[i]);
myv[n+i] = myv[i];
}
int cont = 0;
int soma = 0;
int resp = 0;
for(int i = 1;i<=2*n;i++){
soma += myv[i];
resp = max(resp,soma);
cont++;
//printf("(%d %d)\n",soma,resp);
if(soma < 0){
soma = 0;
cont = 0;
//printf("[%d]\n",i);
}
if(cont == n){
cont = 0;
soma = 0;
i = i-n+2;
}
}
printf("%d\n",resp);
return 0;
}

view raw

pizza.cpp

hosted with ❤ by GitHub