~cpp #include <iostream> using namespace std; #include <algorithm> #include <fstream> #include <string> #include <vector> #include <cmath> ifstream fin("test.txt"); struct Data { string data; int p; float priority; bool operator() (const Data* a, const Data* b) { if (a->data < b->data) return true; return false; } }; struct Node { string data; int p; int level; Node* left; Node* right; }; vector <Data*> indata; Node* root; int sum; bool compare(const Data* a, const Data* b) { if (a->priority > b->priority) return true; return false; } void input() { int number; fin >> number; Data* d; string data; int p; indata.reserve(number); for (int i = 0; i < number; i++) { fin >> data >> p; d = new Data(); d->data = data; d->p = p; indata.push_back(d); } } void insertNode(int i) { Node * newNode = new Node(); newNode->data = indata[i]->data; newNode->p = indata[i]->p; newNode->left = newNode->right = NULL; int l = 1; Node * temp = root; Node * parent = NULL; while (temp) { l++; parent = temp; if (temp->data < newNode->data) temp = temp->right; else if (temp->data > newNode->data) temp = temp->left; else return; } if (parent) { if (parent->data < newNode->data) parent->right = newNode; else parent->left = newNode; } else root = newNode; newNode->level = l; } void makeTree() { root = NULL; for (int i = 0; i < indata.size(); i++) insertNode(i); } void inorder(Node* t) { if (t->left) inorder(t->left); cout << t->data << " "; sum = sum + t->level * t->p; if (t->right) inorder(t->right); } void show() { sum = 0; inorder(root); cout << "\n총 cost : " << sum << endl; } void priorPrioritySet(int left, int right, int p) { if (left >= right) return; indata[(left + right) / 2]->priority = p; priorPrioritySet(left, (left + right) / 2, p - 41); priorPrioritySet((left+right) / 2 + 1, right, p - 41); } void process() { sort(indata.begin(),indata.end(),Data()); int size = indata.size(); priorPrioritySet(0, size-1, 0); float middle = size / 2.0; // for (int i = 0; i < size; i++) // indata[i]->priority += (float)indata[i]->p; sort(indata.begin(),indata.end(),compare); makeTree(); show(); } int main() { input(); process(); return 0; }