ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-22 14:30:34  阅读:186  来源: 互联网

标签:const name int 题解 C++ operator istream Employee 排名


题目

题目描述

新年要来了!

你作为拥有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函数使用方法

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


原创不易,感谢支持。

标签:const,name,int,题解,C++,operator,istream,Employee,排名
来源: https://blog.csdn.net/qq_35630119/article/details/122634869

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有