题目
题目地址:
题解
本题没什么难度,但是要注意细节问题,下面简单来说一下;
vector 把输入的学生打分存起来,直接用算法库中的 sort 函数给它们排个序,之后直接剔除首尾两端的元素,之后简单算个平均就解决了问题;
代码过程中需要注意的有两点:
1. 获得一行整数输入
使用 cin.get() 接收 '\n' 判断本行输入是否结束即可;贴一段样例代码
1 #include2 #include 3 using namespace std; 4 5 int main() { 6 vector vec; 7 int n = 0; 8 cin >> n; 9 vec.push_back(n);10 while (cin.get() != '\n') {11 cin >> n;12 vec.push_back(n);13 }14 cout << endl;15 for (int i = 0; i < vec.size(); i++)16 cout << vec[i] << endl;17 18 return 0;19 }
写这段样例的时候才发现我对while (cin.get() != '\n) 的理解存在一些偏误,说来本题的代码能AC真的是靠运气QAQ!在设计算法的时候刚好避开了这个坑;
问题就在于——cin.get() 会把本行输入的第一个字符吞了,但是上面这段代码恰好规避了这个问题,所以在以上代码的基础上改一下,把第8、9行注释了,我们再来看这段代码
1 #include2 #include 3 using namespace std; 4 5 int main() { 6 vector vec; 7 int n = 0; 8 while (cin.get() != '\n') { 9 cin >> n;10 vec.push_back(n);11 }12 cout << endl;13 for (int i = 0; i < vec.size(); i++)14 cout << vec[i] << endl;15 16 return 0;17 }
输入一下样例以及得到的结果
31534 3143 54454 23153431435445423
我们就可以发现,第一个数的3不见了,因为当 cin.get() 判断的过程中会把本行中的第一字符直接吞了,这是需要特别注意的问题;
而在我代码过程中,因为第一个数直接加到了最后的结果变量上,因此相当于运行的 while(cin.get() != '\n') 是从第二个数开始,而在第二个数之前有第一个数输入结束之后的空格,因此有效地规避了这个吞字符地问题,这运气真的是没谁了。。。。。。
2. 浮点数的除法问题
因为除法运算之后可能不是整数,因此数据类型应特别注意
代码
1 #include2 #include 3 #include 4 using namespace std; 5 6 int main() { 7 int n = 0, m = 0; 8 cin >> n >> m; 9 for (int i = 0; i < n; i++) {10 vector tmp_vec;11 float out = 0;12 float stu = 0;13 int tmp;14 cin >> tmp;15 out += tmp;16 while (cin.get() != '\n') {17 cin >> tmp;18 if (tmp >= 0 && tmp <= m)19 tmp_vec.push_back(tmp);20 }21 sort(tmp_vec.begin(), tmp_vec.end());22 tmp_vec.erase(tmp_vec.begin());23 tmp_vec.erase(tmp_vec.begin() + tmp_vec.size() - 1);24 for (int j = 0; j < tmp_vec.size(); j++)25 stu += tmp_vec[j];26 stu = stu / tmp_vec.size();27 out += stu;28 out = out / 2 + 0.5;29 cout << int(out) << endl;30 tmp_vec.clear();31 }32 33 return 0;34 }