版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zh1204190329/article/details/82590009
某公司有N名员工,给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资。他按照工资的频次降序排列,即给定清单中所有频次较高的工资在频次较低的工资之前出现。如果相同数量相同的员工有相同的工资,则将按照给定清单中该工资第一次出现的顺序排列。
写一个算法帮助财务人员排列员工工资的顺序。
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <string.h>
#include <stack>
using namespace std;
typedef struct _CntOrder {
int count; // 工资出现的次数
int order; // 工资出现的顺序
} CntOrder;
typedef pair<int, CntOrder> PAIR;
bool cmp(const PAIR& lhs, const PAIR& rhs) {
if (lhs.second.count != rhs.second.count)
return lhs.second.count > rhs.second.count;
//else if (lhs.second.count == rhs.second.count)
else
return lhs.second.order < rhs.second.order;
}
int main() {
int num;
cin >> num;
int money;
map<int, CntOrder> salarylist; // 工资列表
/*
* test case
* 24
10000 20000 40000 30000 30000 70000 70000 70000
30000 40000 20000 50000 50000 50000 50000 60000
60000 40000 40000 60000 70000 80000 90000 100000
*
* */
for (int i = 0; i < num; i++) {
cin >> money;
++salarylist[money].count;
if (salarylist[money].order == 0)
salarylist[money].order = i;
}
vector<PAIR> salaryinput(salarylist.begin(), salarylist.end()); // 把map数据存入vector中
sort(salaryinput.begin(), salaryinput.end(), cmp);
cout << "[";
for (int i = 0; i != salaryinput.size() - 1; ++i) {
for (int j = 0; j < salaryinput[i].second.count; j++)
cout << salaryinput[i].first << ", ";
}
for (int j = 0; j < salaryinput[salaryinput.size() - 1].second.count - 1;
j++)
cout << salaryinput[salaryinput.size() - 1].first << ", ";
if (salaryinput[salaryinput.size() - 1].second.count)
cout << salaryinput[salaryinput.size() - 1].first;
cout << "]";
return 0;
}
输出:
[40000, 40000, 40000, 40000, 70000, 70000, 70000, 70000, 50000, 50000, 50000, 50000, 30000, 30000, 30000, 60000, 60000, 60000, 20000, 20000, 10000, 80000, 90000, 100000]