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()

Multiset擦除最后一个元素

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))的主要内容,如果未能解决你的问题,请参考以下文章

PAT乙级1077 互评成绩计算 (20 分)

1077 互评成绩计算

PTA(Basic Level)1077.互评成绩计算

PAT Basic 1077

1077 Kuchiguse (20point(s)) Easy only once

PAT乙级题库“傻瓜”题解之互评成绩