#include using namespace std; class Node { public: Node(int R, int X) { r = R; x = X; } ~Node(); int r, x; Node *pre; Node *next; }; Node::~Node() {} class List { public: List(int A, int B) { a = A; b = B; head = NULL; tail = NULL; } ~List(); void add(Node *n); void addToHead(Node *n); void prune(); void print(); void cut(Node *n); void study(); Node *least(); List *sleep(); Node *head; Node *tail; int a, b; }; int main() { int N, A, B, W; int s, x; cin >> N >> A >> B >> W; int *D = new int[N]; List *list = new List(A, B); for (int i = 0; i < N; i++) { cin >> D[i]; } Node *n = new Node(W, 0); list->add(n); for (int i = 0; i < N; i++) { n = list->least(); Node *sleepNode = new Node(n->r + D[i], 0); list->study(); list->addToHead(sleepNode); list->prune(); // list->print(); } n = list->least(); cout << n->r << endl; delete list; } List::~List() { Node *cur = head; if (cur) { while (cur->next) { head = cur->next; delete cur; cur = head; } } if (cur) delete cur; } // add the node n to the tail of the list void List::add(Node *n) { if (!head) { n->pre = NULL; n->next = NULL; head = n; tail = n; } else { n->pre = tail; n->next = NULL; tail->next = n; tail = n; } } // add the node n to the head of the list void List::addToHead(Node *n) { if (!head) tail = n; n->next = head; head = n; } // prune the decision tree void List::prune() { Node *n1, *n2; n1 = head; if (!n1) return; n2 = head->next; while (n1->next) { while (n2) { if (n2->r > n1->r) { n1->next = n2->next; if (n2 == tail) tail = n1; } else break; delete n2; n2 = n1->next; } if (!n2) { n1->next = NULL; tail = n1; } else { n1 = n2; n2 = n2->next; } } } // print the content of the nodes in the list void List::print() { Node *cur = head; while (cur) { cout << cur->r << " " << cur->x << endl; cur = cur->next; } } // let n to be the tail node void List::cut(Node *n) { Node *cur = n->next; Node *tmp; while (cur) { tmp = cur; cur = cur->next; delete tmp; } n->next = NULL; tail = n; } // let every nodes in the list study next day void List::study() { Node *cur = head; while (cur) { cur->x = cur->x + 1; cur->r = cur->r + cur->x * b - a; cur = cur->next; } } // return the node with min r Node *List::least() { Node *cur = head; Node *leastNode = head; int min = head->r; while (cur) { if (cur->r < min) { leastNode = cur; min = cur->r; } cur = cur->next; } return leastNode; }