PAT 乙级 1077
题目
题目地址:PAT 乙级 1077
题解
本题没什么难度,但是要注意细节问题,下面简单来说一下;
vector 把输入的学生打分存起来,直接用算法库中的 sort 函数给它们排个序,之后直接剔除首尾两端的元素,之后简单算个平均就解决了问题;
代码过程中需要注意的有两点:
1. 获得一行整数输入
使用 cin.get() 接收 '\n' 判断本行输入是否结束即可;贴一段样例代码
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int main() { 6 vector<int> 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 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int main() { 6 vector<int> 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 23 1534 3143 54454 23
我们就可以发现,第一个数的3不见了,因为当 cin.get() 判断的过程中会把本行中的第一字符直接吞了,这是需要特别注意的问题;
而在我代码过程中,因为第一个数直接加到了最后的结果变量上,因此相当于运行的 while(cin.get() != '\n') 是从第二个数开始,而在第二个数之前有第一个数输入结束之后的空格,因此有效地规避了这个吞字符地问题,这运气真的是没谁了。。。。。。
2. 浮点数的除法问题
因为除法运算之后可能不是整数,因此数据类型应特别注意
代码
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 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<int> 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 }