题解
复杂数据处理题目 |
---|
此题的数据不难处理 |
乙级最后一个题很多这种 |
给很多数据,让处理 |
首先还是要看数据结构 |
有映射关系,学校 - 人数和权值 |
最好是利用两个map进行解决,一个映射人数,一个映射权值 |
如果都将他们放到一个map的结构体里,会有点过不去,数据处理问题往往实现的较为困难,但是慢慢做也是可以出来 |
但有一些点就会被忽略掉,还有慢慢改bug,最好是首先就选择一个好是数据结构 |
糟糕的实现,往往顾不上细节的代码,只为了大致的正确 |
以下为柳神题解 |
两个map,⼀个cnt⽤来存储某学校名称对应的参赛⼈数,另⼀个sum计算某学校名称对应的总
加权成绩。每次学校名称string school都要转化为全⼩写,将map中所有学校都保存在vector ans中,
类型为node,node中包括学校姓名、加权总分、参赛⼈数。对ans数组排序,根据题⽬要求写好cmp
函数,最后按要求输出。对于排名的处理:设⽴pres表示前⼀个学校的加权总分,如果pres和当前学
校的加权总分不同,说明rank等于数组下标+1,否则rank不变~
注意:总加权分数取整数部分是要对最后的总和取整数部分,不能每次都直接⽤int存储,不然会有⼀
个3分测试点不通过~
Code
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
struct node
{
int x;
string s;
int cnt;
};
double f(int x, char c)
{
if (c == 'T')
return x * 1.5;
else if (c == 'A')
return x;
else if (c == 'B')
return x / 1.5;
}
bool cmp(node &e1, node &e2)
{
if (e1.x == e2.x)
{
if (e1.cnt == e2.cnt)
return e1.s < e2.s;
return e1.cnt < e2.cnt;
}
return e1.x > e2.x;
}
int main()
{
vector<node> v;
map<string, int> rap;
map<string, double> sum;
int N;
cin >> N;
while (N--)
{
string a, name;
double x;
cin >> a >> x >> name;
for (auto &e : name)
e = tolower(e);
x = f(x, a[0]);
rap[name]++;
sum[name] += x;
}
for (auto &e : rap)
{
v.push_back({(int)sum[e.first], e.first, e.second});
}
sort(v.begin(), v.end(), cmp);
int t = 1;
int level = -1;
cout << rap.size() << endl;
for (int i = 0; i < v.size(); i++)
{
if (level != v[i].x)
t = i + 1;
cout << t << ' ';
cout << v[i].s << " " << (int)v[i].x << " " << v[i].cnt << endl;
level = (int)v[i].x;
}
return 0;
}