题目描述:
某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。数据库里面统计了每个开源项目关注、收藏、fork、issue、MR的数量,开源项目的热度根据这5个维度的加权求和进行排序。H = Wwatch X#watch + Wstar X#star +Wfork X#fork +Wissue X#issue +Wmr X#mr H表示热度值,Wwatch、Wstar、Wfork、Wissue、Wmr分别表示5个统计维度的权重,#watch、#star、#fork、#issue、#mr分别表示5个统计维度的统计值。榜单按照热度值降序排序,对于热度值相等的,按照项目名字转换为全小写字母后的字典序排序
('a','b','c',...,'x','y','z')。
输入描述:
第一行输入为N,表示开源项目的个数,0<N<=100。
第二行输入为权重值列表,一共5个整型值,分别对应关注、收藏、fork、issue、MR的权重,权重取值0<W<=50。
第三行开始接下来的N行为开源项目的统计维度,每一行的格式为:name nr_watch nr_star nr_fork nr_issue nr_mr,其中name为开源项目的名
字,由英文字母组成,长度<=50,其余5个整型值分别为该开源项目关注、收藏、fork、issue、MR的数量,数量取值0<nr<=1000。
输出描述:
按照热度降序,输出开源项目的名字,对于热度值相等的,按照项目名字转换为全小写字母后的字典序排序('a'>'b'>'c'>...>'x'>'y'>'z')。
C++源码:
#include <iostream>
#include <string>
#include <ctime>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <map>
#include <sstream>
using namespace std;
struct Project {
string name;
int watch, star, fork, issue, mr;
int heat;
Project(string n, int w, int s, int f, int i, int m)
: name(n), watch(w), star(s), fork(f), issue(i), mr(m),heat(0) {}
void calculateHeat(const vector<int>& weights) {
heat = 0;
for (int i = 0; i < 5; ++i) {
heat += weights[i] * ((i == 0) ? watch :
(i == 1) ? star :
(i == 2) ? fork :
(i == 3) ? issue : mr);
}
}
};
bool compareProjects(const Project& p1, const Project& p2) {
if (p1.heat != p2.heat) {
return p1.heat > p2.heat;
}
else {
return p1.name < p2.name;
}
}
int main() {
int N;
cin >> N;
vector<int> weights(5);
for (int& w : weights) cin >> w;
vector<Project> projects;
for (int i = 0; i < N; ++i) {
string name;
int nr_watch, nr_star, nr_fork, nr_issue, nr_mr;
cin >> name >> nr_watch >> nr_star >> nr_fork >> nr_issue >> nr_mr;
Project p(name, nr_watch, nr_star, nr_fork, nr_issue, nr_mr);
p.calculateHeat(weights);
projects.push_back(p);
}
sort(projects.begin(), projects.end(), compareProjects);
for (const Project& p : projects) {
cout << p.name << endl;
}
system("pause");
return 0;
}