-
Notifications
You must be signed in to change notification settings - Fork 0
/
exercicio9.c
93 lines (69 loc) · 1.55 KB
/
exercicio9.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//
// main.c
// foo
//
// Created by Eduardo Pacheco on 30/11/16.
// Copyright © 2016 Eduardo Pacheco. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n;
int v [50];
int* optmem;
int opt (int i, char onbuy);
int main () {
int i;
scanf("%d", &n);
for (i = 0; i < n; ++i)
scanf("%d", &v[i]);
optmem = (int*) malloc(sizeof(int) * n * 2);
memset(optmem, 0xFF, sizeof(int)*n*2);
printf("%d\n", opt (0, 0));
int j;
for (int i = 0; i < n; i += 2) // mais dois para pular o dai da venda e do resfriamento
{
for (j = i; j < n && optmem[j + n] < optmem[j+1 + n]; ++j); // procura o dia da venda
if (j == n) // nao houve mais vendas => nao houve mais compras
{
for (; i < n; ++i)
printf("nada ");
}
else
{
int profit = optmem[i] - optmem[j];
for (; i < j && (v[j] - v[i] != profit); ++i) // procura o dia da compra otima
printf("nada ");
printf("compra ");
++i;
for (; i < j; ++i)
printf("nada ");
}
printf("venda resfriamento ");
}
printf("\n");
return 0;
}
int opt (int i, char onbuy) {
if (i >= n)
return 0;
if (optmem [i + onbuy*n] != -1)
return optmem[i + onbuy*n];
int ret, aux;
if (!onbuy) // pode comprar
{
ret = opt (i + 1, 1) - v[i]; // compra
aux = opt (i + 1, 0); // nao faz nada
if (aux > ret)
ret = aux;
optmem[i + onbuy*n] = ret;
return ret;
}
// tem que vender
ret = opt (i + 2, 0) + v[i]; // vende, pula resfriamento
aux = opt (i + 1, 1); // nao faz nada
if (aux > ret)
ret = aux;
optmem [i + onbuy*n] = ret;
return ret;
}