Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Стартапы - 3
- Как это часто бывает, стартапы вырастают, сливаются с кем-то, ну или на крайняк продаются большим компаниям. Как бы там ни было, заказчик снова попросил изменить нашу программу в связи с изменением структуры.
- Его компания стала сильно больше, поэтому добавились менеджеры между ним и тимлидами - мидлы. Их зарплата считается как ставка 50 у.е. плюс 2 у.е. за каждого подчиненного.
- Кроме этого, он оценил ваш очень удобный функциоал по подсчету зарплат, однако заметил, что чаще всего именно он получает самую большую зарплату, поэтому попросил вас не учитывать его в подсчетах. Также для его гениальной иновационной задумки - доски почета, ему нужен теперь не один человек с самой большой зарплатой, а рейтинг всех сотрудников, кроме него.
- Входные данные:
- ... (то же самое)
- Выходные данные:
- Выведите в первой строке общее количество у.е. на выплату зарплат, а далее рейтинг всех сотрудников, кроме CEO (список, отсортированный по убыванию зарплаты).
- Примечание:
- Не забывайте про полиморфизм и очищение памяти.
- */
- #include <iostream>
- #include <vector>
- #include <string>
- using namespace std;
- class Worker {
- protected:
- string name;
- int rate;
- public:
- Worker(string n, int r = 10) : name(n), rate(r) {}
- virtual void info() {
- cout << "Worker " << name << ": " << rate << endl;
- }
- virtual int get_salary() {
- return rate;
- }
- virtual int type() {
- return 3;
- }
- };
- class Manager : public Worker {
- protected:
- int staff;
- public:
- Manager(string n, int s, int r) : staff(s), Worker(n, r) {}
- virtual void info() {
- cout << "Manager " << name << ": " << rate
- << ". Works with " << staff << " people" << endl;
- }
- };
- class TeamLeader : public Manager {
- public:
- TeamLeader(string n, int s, int r = 20) : Manager(n, s, r) {}
- virtual int get_salary() {
- return rate + (staff + 1) / 2;
- }
- virtual int type() {
- return 2;
- }
- };
- class Middle : public Manager {
- public:
- Middle(string n, int s, int r = 50) : Manager(n, s, r) {}
- virtual int get_salary() {
- return rate + staff * 2;
- }
- virtual int type() {
- return 1;
- }
- };
- class CEO : public Manager {
- public:
- CEO(string n, int s, int r = 100) : Manager(n, s, r) {}
- virtual void info() {
- cout << "CEO " << name << ": " << rate
- << ". Works with " << staff << " people" << endl;
- }
- virtual int type() {
- return 0;
- }
- };
- void swap(Worker* &a, Worker* &b) {
- Worker* tmp = a;
- a = b;
- b = tmp;
- return;
- }
- int main() {
- int m;
- cin >> m;
- vector<Worker*> company;
- Worker* tmp;
- string com, n;
- int s;
- for (int i = 0; i < m; i++) {
- cin >> com >> n;
- if (com == "worker") {
- tmp = new Worker(n);
- company.push_back(tmp);
- } else if (com == "teamleader") {
- cin >> s;
- tmp = new TeamLeader(n, s);
- company.push_back(tmp);
- } else if (com == "middle") {
- cin >> s;
- tmp = new Middle(n, s);
- company.push_back(tmp);
- } else if (com == "ceo") {
- cin >> s;
- tmp = new CEO(n, s);
- company.push_back(tmp);
- }
- }
- int sum = 0;
- for (int i = 0; i < company.size(); i++) {
- sum += company[i]->get_salary();
- }
- for (int j = 0; j < company.size() - 1; j++) {
- bool f = false;
- for (int i = 0; i < company.size() - j - 1; i++) {
- if (company[i]->get_salary() < company[i + 1]->get_salary()) {
- swap(company[i], company[i + 1]);
- f = true;
- }
- }
- if (!f) break;
- }
- cout << sum << endl;
- for (int i = 0; i < company.size(); i++) {
- if (company[i]->type() != 0)
- company[i]->info();
- }
- for (int i = 0; i < company.size(); i++) {
- delete company[i];
- }
- return 0;
- }
- /*Пример теста:
- Вход:
- 5
- worker Vanya
- teamleader Petya 1
- ceo Vasya 1
- middle Serega 2
- teamleader Moisha 0
- Выход:
- 205
- Manager Serega: 50. Works with 2 people
- Manager Petya: 20. Works with 1 people
- Manager Moisha: 20. Works with 0 people
- Worker Vanya: 10
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement