题目
题目描述
新年要来了!
你作为拥有n个员工的CEO,该给员工们的业绩进行年度排名的时候了。
通过n位员工今年各项指标(技能p,沟通r,合作s,项目t),
计算出各个员工的年度业绩,并按照从高到低输出每个人的名称name。
业绩的计算方式如下:
业
绩
=
40
%
p
+
30
%
r
+
20
%
s
+
10
%
t
业绩 = 40\%p + 30\%r + 20\%s + 10\%t
业绩=40%p+30%r+20%s+10%t
输入格式
第一行为一个正整数 n ( n ≤ 10000 ) n(n \leq 10000) n(n≤10000)。
接下来n行,每一行分别对应一个员工的信息。格式为
name p r s t
其中,name为一个不超过20的不含空格的英文名。p、r、s、t分别为一个不大于1000的正整数。
输出格式
输出n行,每一行为一个人的名字。
行末无空格。
题解
#include<iostream>
#include<string>
#include<algorithm>
#include<functional>
using namespace std;
const int N = 10010;
class Employee{
private:
int q,r,s,t;
public:
string name;
bool operator>(const Employee &a) const;
friend istream& operator>>(istream& in,Employee& a);
};
Employee E[N];
bool Employee::operator>(const Employee &a) const{
int r1 = this->q * 4 + this->r * 3 + this->s * 2 + this->t;
int r2 = a.q * 4 + a.r * 3 + a.s * 2 + a.t;
if(r1 == r2)
return this->name < a.name;
return r1 > r2;
}
istream& operator>>(istream& in,Employee& a){
in >> a.name >> a.q >> a.r >> a.s >> a.t;
return in;
}
int main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int n;
cin >> n;
for(int i = 0;i < n;i++)
cin >> E[i];
sort(E,E + n,greater<Employee>());
for(int i = 0;i < n;i++)
cout << E[i].name << endl;
return 0;
}
第7到16行
class Employee{
private:
int q,r,s,t;
public:
string name;
bool operator>(const Employee &a) const;
friend istream& operator>>(istream& in,Employee& a);
};
Employee E[N];
因为每个员工的信息比较多,所以使用结构体或者类作为存储结构会比较好。
如图所示,我们可以定义一个员工类的数组,员工的信息分别存储在其中每一个元素的对应位置里。
这里还要提到一点,就是相比于C语言的结构体,C++的类除了能够构建一个“组合”的结构,还能够为这个结构定义“专属的函数”——即成员函数。
第12、13行和第18至29行
bool operator>(const Employee &a) const;
friend istream& operator>>(istream& in,Employee& a);
bool Employee::operator>(const Employee &a) const{
int r1 = this->q * 4 + this->r * 3 + this->s * 2 + this->t;
int r2 = a.q * 4 + a.r * 3 + a.s * 2 + a.t;
if(r1 == r2)
return this->name < a.name;
return r1 > r2;
}
istream& operator>>(istream& in,Employee& a){
in >> a.name >> a.q >> a.r >> a.s >> a.t;
return in;
}
这是对大于号>
的运算符重载。以及对于右移运算符>>
的重载。
重载大于号运算符里规定了如何对两个Employee
对象进行大于号运算,使得可以直接对两个Employee
对象使用大于号进行比较。
重载了右移运算符是为了方便输入,使得可以直接使用cin >> E[i];
实现将数据从输入流直接送给Employee
对象。
可参考资料:C++ 重载运算符和重载函数
第39行
sort(E,E + n,greater<Employee>());
这里使用了库函数进行比较。sort
函数定义在algorithm
头文件中,使用前记得包含。
sort
函数有三个函数,
第一个参数对应数组的首地址的位置,第二个参数对应数组的最后一个元素的地址的下一个位置,第三个参数可以省略,省略是默认使用小于号运算符<
进行元素间的比较,以升序排序。
如果要以降序排序,则需要指定第三个函数为greater<>
。这时会使用元素间的大于号运算符>
进行比较。
可参考资料:C++中SORT函数使用方法
类似于这种题,当信息比较庞大、处理比较复杂时,要有使用面向对象的设计方法来降低编程难度的思维。
原创不易,感谢支持。