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
#include <iostream>
#include <vector>

#define D(x, y) ((x) == (y) ? 0 : 1)

using namespace std;

int main()
{
    int n,c;
    int filled = 0;
    int MAX = 0;
    cin >> n;
    cin >> c;
    int pattern_c = 0;
    int temp;
    vector<pair<int,int>> bricks(n+1);
    vector<int> N(n);
    for(int i=0;i<n;i++)
    {
        cin >> bricks[i].first;
        cin >> bricks[i].second;
    }
    bricks[n].first = 0;        //Dla przypadku gdy ostatnia kostka jest wieksza od pozostalych
    bricks[n].second = 0;

    N[0] = bricks[0].first;
    while(bricks[pattern_c+1].first == bricks[pattern_c].first)
    {
        N[pattern_c] = bricks[pattern_c].first;
        pattern_c++;
    }
    filled = pattern_c+1;
    pattern_c = 0;
    while(filled != n)
    {
        while(bricks[filled+pattern_c+1].first == bricks[filled+pattern_c].first)
        {
            pattern_c++;
        }
        for(int i=0;i<=pattern_c;i++)
        {
            for(int j=0;j<filled;j++)
            {
                temp = N[j]-c*D(bricks[j].second,bricks[filled+pattern_c].second)+bricks[filled+pattern_c].first;
                if(temp > MAX)
                {
                    MAX = temp;
                }
            }
            if(bricks[filled+pattern_c].first > MAX)
            {
                MAX = bricks[filled+pattern_c].first;
            }
            N[filled+pattern_c] = MAX;
            MAX = 0;
        }
        filled = filled+pattern_c+1;
        pattern_c = 0;
    }

    MAX = N[0];
    for(int i=1;i<n;i++)
    {
        if(N[i]>MAX)
        {
            MAX = N[i];
        }
    }
    cout << MAX;
}