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 }

 

posted @ 2018-09-20 21:19  moujun  阅读(245)  评论(0编辑  收藏  举报