Solução por Rogério Júnior
Para ver o problema original, clique aqui.
Vamos salvar a sequência no array , e depois ordená-lo. Vamos agora processar ordenadamente cada um dos números do vetor. Seja o menor inteiro que não conseguimos formar com os elementos que já temos. Antes de processar qualquer elemento, o valor de é , pois não temos elementos para formá-lo.
Agora, para cada elemento, observe o processamento do -ésimo elemento do array. Se é o menor elemento que não podemos formar, então conseguimos formar todas as somas de a . Se , então não há como formarmos o valor de usando elemento anteriores a (por definição de ) nem com elemento a partir de (pois serão todos maiores que ). Logo não preciso mais processar o resto do vetor e a resposta é .
Entretanto, se , consigo formar todos os valores de a , pois sendo uma soma qualquer, seja . Logo para utilizarmos em um subconjunto a fim de obtermos soma , precisamos formar com outros, e só conseguimos formar . Logo, o novo valor de é e partiremos para a análise do próximo elemento. Segue o código para melhor entendimento:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// URI - 1690 | |
// Rogério Júnior | |
// O(n log n) | |
#include <cstdio> | |
#include <algorithm> | |
using namespace std; | |
#define MAXN 10100 | |
int t, n, vetor[MAXN]; | |
int main(){ | |
scanf("%d", &t); | |
// para cada caso | |
while(t--){ | |
scanf("%d", &n); | |
// salvo os números em vetor | |
for(int i=0; i<n; i++) scanf("%d", &vetor[i]); | |
// ordeno os elementos de vetor | |
sort(vetor, vetor+n); | |
// resp começa com 1 | |
long long int resp=1; | |
// para cada elemento | |
for(int i=0; i<n; i++){ | |
// se ele for maior que resp, não podemos formá-labs | |
// e o algoritmo para | |
if(vetor[i]>resp) break; | |
// caso contrário, atualizamos o valor de resp | |
else resp+=vetor[i]; | |
} | |
// no fim, imprimimos o valor de resp | |
printf("%lld\n", resp); | |
} | |
return 0; | |
} |