1077 互评成绩计算 (20 point(s))
Posted Atl212
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1077 互评成绩计算 (20 point(s))相关的知识,希望对你有一定的参考价值。
中间写错了一次,错把分组数 N - 1 当初平均分的人数,实际的人数应该不包含 [0,M] 范围之外,并且要剔除最高和最低分的人。
后面调试时候才发现测试样例是有重复数据的,所以不能用 set 得用 multiset 。用 map 和 set 的时候还是得注意数据里面是否有重复的数据,不然就像前面 《1075 链表元素分类》,卡测试点。这题还有样例提示,而有些题目考试没有提示就完蛋了。
multiset 容器开始的时候想用 erase() 函数来擦除最低分和最高分,但是发现编译的时候放入 rbegin() 反向首个元素会导致错误。查了下才发现这个函数只能用正向的迭代器地址,所以得改成 --end()
sort(v.begin(), v.end());
for (int i = 1; i < v.size() - 1; ++i)
sum += v[i];
参考了下别人的写法,发现用排序后的向量直接从中间开始遍历要比用 multiset 精简一点。因为向量可以用下标遍历,但是 multiset 不可以。
还有是四舍五入的,如果是在除之后再四舍五入那么应该加上 0.5 。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i++){
double G1 = 0, G2 = 0, cnt = 0, tmp;
multiset<double> tmpG1;
cin >> G2;
// 除了老师的其他组
for(int j = 0; j < n - 1; j++){
cin >> tmp;
// 判断输入合法
if(0 <= tmp && tmp <= m) tmpG1.insert(tmp);
}
//去掉最高和最低
tmpG1.erase(tmpG1.begin());
tmpG1.erase(tmpG1.rbegin());
// 计算G1
for(auto g: tmpG1) G1 += g;
G1 /= tmpG1.size();
// 四舍五入为整数
cout << (int)((G1 + G2 + 1) / 2) << endl;
}
}
以上是关于1077 互评成绩计算 (20 point(s))的主要内容,如果未能解决你的问题,请参考以下文章