原题:
小易是班级的英语课代表, 他开发了一款软件开处理他的工作。
小易的软件有一个神奇的功能,能够通过一个百分数来反应你的成绩在班上的位置。“成绩超过班级 …% 的同学”。
设这个百分数为 p,考了 s 分,则可以通过以下式子计算得出 p:
p = ( 分数不超过 s 的人数 – 1) 班级总人数
突然一天的英语考试之后,软件突然罢工了,这可忙坏了小易。成绩输入这些对于字写得又快又好的小易当然没有问题,但是计算这些百分数……这庞大的数据量吓坏了他。
于是他来找到你,希望他编一个程序模拟这个软件:给出班级人数 n,以及每个人的成绩,请求出某几位同学的百分数。
数据结构
vec映射:存放所有同学id以及成绩。
sort_vec数组:存放所有同学id以及成绩,然后根据学生成绩从小到大排序。
m映射:存放成绩以及成绩超过班级百分比。
生成答案:
vec映射保存原始同学的数据,方便根据同学id查询成绩。利用sort_vec数组对同学成绩进行排序。利用排好序的sort_vec数组计算每个成绩所对应的成绩超过班级百分比,存放到m映射中。
答案获取的过程
假设询问同学id。
- vec[id]获取同学成绩
- m[vec[id]]获取同学成绩所对应的成绩超过班级百分比,这就是答案
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int cmp(const pair<int, double> &a, const pair<int, double> &b){
return a.second < b.second;
}
int main(){
int n;
cin >> n;
map<int, double> vec;
vector<pair<int, double>> sort_vec;
for (int i = 0; i < n; ++i){
int s;
cin >> s;
vec[i+1] = s;
sort_vec.push_back(pair<int, double>(i, s));
}
sort(sort_vec.begin(), sort_vec.end(), &cmp);
map<int, double> m;
for (int i = 0; i < sort_vec.size(); ++i){
m[sort_vec[i].second] = (double)i*100 / sort_vec.size();
}
int q;
cin >> q;
for (int i = 0; i < q; ++i){
int ind;
cin >> ind;
printf ("%.6f\n", m[vec[ind]]);
}
return 0;
}
版权声明:本文为zxc120389574原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。