[C++][题解]业绩排名

题目

题目描述

新年要来了!

你作为拥有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语言的结构体,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函数使用方法

类似于这种题,当信息比较庞大、处理比较复杂时,要有使用面向对象的设计方法来降低编程难度的思维。


原创不易,感谢支持。

上一篇:Java 泛型


下一篇:Spring Boot: 集成Mybatis 返回自增主键, 存储过程调用, 传递多参数,where set trim foreach用法 association和collection嵌套查询 集合查