刷题就是照镜子——第一次刷2008年初赛题感受

           2020年5月9号,我做了一套NOIP 2008 普及组初赛试题。两个小时28道题,我仅仅对了18道,得了53分,有点惨。但是爸爸说:“刷题就是照镜子”,虽然比较惨不忍睹,但是却让我发现了许多许多的不足。现在整理一下,把错题搞定,下次不错!

  错题1:

  Web2.0是近年来互联网的热门概念之一,其核心思想是互动与分享。下列网站中,( )是典型的Web2.0应用。

           
   Google
  正确答案:B
  我的答案:D
  这道题题考察的是基础计算机知识,看来我的这种基础知识掌握的还不够。后来查了查资料算是了解了一些:Web2.0是相对于Web1.0的新的时代。指的是一个利用Web的平台,由用户主导而生成的内容互联网产品模式,为了区别传统由网站雇员主导生成的内容而定义为第二代互联网,web2.0是一个新的时代。web2.0 体现交互,可读可写,体现出的方面是各种微博、相册,用户参与性更强。Web2.0包含了我们经常使用到的服务,以BBS和博客为主要代表,Flickr 雅虎旗下图片分享网站。一般认为Flickr是Web 2.0应用方式的绝佳例子。

  错题2:

  递归过程或函数调用时,处理参数和返回地址,通常使用一种称为( )的数据结构。

            
  正确答案:D
  我的答案:C
  这一方面的内容我还没学到,现在我明白了。

  错题3:

  二叉树T,已知其先根遍历是1 2 4 3 5 7 6(数字为结点的编号,以下同),中根遍历是2 4 1 5 7 3 6,则该二叉树的后根遍历是( )。

            4 2 7 6 5 3 1
  正确答案: B
  我的答案: D
  这道题考的是二叉树的先序,中序,后序遍历。从这道题可以看出,我的二叉树遍历掌握得不是很熟练,以后要多加练习。

  错题4:

  面向对象程序设计(Object-Oriented Programming)是一种程序设计的方法论,它将对象作为程序的基本单元,将数据和程序封装在对象中,以提高软件的重用性、灵活性和扩展性。下面关于面向对象程序设计的说法中,不正确的是( )。

            面向对象的程序设计的雏形来自于Simula语言,后来在SmallTalk语言的完善和标准化的过程中得到更多的扩展和对以前思想的重新注解。至今,SmallTalk语言仍然被视为面向对象语言的基础。
  正确答案: A
  我的答案: C
  这道题题考察的也是基础计算机知识,后来查阅了一下。面向对象程序设计三个基本特征是封装、继承和多态(哎,好专业,也不是很懂)但知道C++就是面向对象的。而面向过程的四条原则是:1、自顶向下;2、逐步求精;3,模块化;4.限制使用goto。比如C和pascal。所以A明显错误。这个题真是让我受教了,解决方法:强记吧!

  错题5:

  下列不属于NOIP竞赛推荐使用的语言环境的是( )。

            Lazarus
  正确答案: B
  我的答案: D
  这也是基础知识部分,看来得找时间大补了。经过查阅得知:Visual C++从来没有被NOIP推荐使用过。解决方法:强记!

  错题6:

  在C++程序中,表达式200|10的值是( )。

            202
  正确答案: D
  我的答案: B
  这个题目涉及一个符号“|”,以前真的没见过。这次又长见识了。叫做“按位或运算”,是先转换成二进制,再按照对应位置取或运算。 200:11001000
     10:1010 按位进行或运算11001010 ,十进制就是202了 。

  错题7:

有6个城市,任何两个城市之间都有一条道路连接,6个城市两两之间的距离如下表所示,则城市1到城市6的最短距离为_____________。 题

正确答案: 7
我的答案: 8
这道题我考虑得不是特别周全,只考虑了经过一座城市的可能性,以后我做题要更加仔细,考虑得更加全面才行。

  错题8:

  阅读程序写结果:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int i, a, b, c, d, f[4];
 6     for(i = 0; i < 4; i++) cin >> f[i];
 7     a = f[0] + f[1] + f[2] + f[3];
 8     a = a / f[0];
 9     b = f[0] + f[2] + f[3];
10     b = b / a;
11     c = (b * f[1] + a) / f[2];
12     d = f[(b / c ) % 4];
13     if(f[(a + b + c + d) % 4] > f[2])
14         cout << a + b<< endl;
15     else 
16         cout << c + d << endl;
17     return 0;
18 }

  输入:9 19 29 39

  正确答案: 23
  我的答案: 18
  这道题不该错,粗心大意算错了,看来我还是不够严谨认真,我得收收心。

  错题9:

  完善程序:
  (字符串替换)给定一个字符串S(S仅包含大小写字母),下面的程序将S中的每个字母用规定的字母替换,并输出S经过替换后的结果。程序的输入是两个字符串,第一个字符串是给定的字符串S,第二个字符串S’由26个字母组成,它是a-z的任一排列,大小写不定,S’规定了每个字母对应的替换字母:S’中的第一个字母是字母A和a的替换字母,即S中的A用该字母的大写替换,S中的a用该字母的小写替换;S’中的第二个字母是字母B和b的替换字母,即S中的B用该字母的大写替换,S中的b用该字母的小写替换;…… 以此类推。

 1 #include <iostream>
 2 #include <string.h>
 3 char change[26], str[5000];
 4 using namespace std;
 5 
 6 void CheckChangeRule()
 7 {
 8     int i;
 9     for (i = 0;i < 26;i ++)
10     {
11         if ( [                   ①                   ] )
12                change[i] -= 'A' - 'a';
13     }
14 }
15 
16 void ChangeString()
17 {
18     int i;
19     for (i = 0;i <strlen(str);i ++)
20     {
21           if (  [                 ②                    ]  )
22                 str[i] = change[str[i] - 'A'] -'a' + 'A';
23           else
24                   [              ③             ]          
25     }
26 }
27 
28 int main()
29 {
30         int i;
31 cin >> str ;
32     cin >> change;
33     CheckChangeRule();
34     [               ④               ] 
35     cout << str << endl;
36     return 0;
37 }
1.
正确答案: change[i] >= 'A' && change[i] <= 'Z'(只写change[i] <= 'Z'也对)
我的答案:change[i]>='A'&&change[i]<='Z'
2.
正确答案: str[i] >= 'A' && str[i] <= 'Z'(只写str[i] <= 'Z'也对)
我的答案:str[i]>='A'&&str[i]<='Z'
3.
正确答案: str[i] = change[str[i] - 'a'];
我正确了。
4.
正确答案: ChangeString();
我正确了。
前两个空我写的跟正确答案一样,但不知道为什么给我判错,和标准答案校对,感觉就是少了空格?还望有知道的同学给我指点一下吧。

  错题10:

  完善程序:

  (找第k大的数) 给定一个长度为1,000,000的无序正整数序列, 以及另一个数n (1<=n<=1000000), 然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4)。

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int a[1000001],n,ans = -1;
 5 void swap(int &a,int &b)
 6 {
 7     int c;
 8     c = a; a = b;    b = c;
 9 }
10 
11 int FindKth(int left, int right, int n)
12 {
13     int tmp,value,i,j;
14     if (left == right) return left;
15     tmp = rand()% (right - left) + left;
16     swap(a[tmp],a[left]);
17     value =[          ①         ];
18     i = left;
19     j = right;
20     while (i < j)
21     {
22         while (i < j && [            ②        ]) j --;
23         if (i < j) {a[i] = a[j]; i ++;} else break;
24         while (i < j && [          ③        ]) i ++;
25         if (i < j) {a[j] = a[i]; j - -;} else break;
26     }
27     [        ④       ]  
28     if (i < n) return  FindKth([               ⑤           ] );
29     if (i > n) return [                  ⑥                        ]        
30     return i;
31 }
32 
33 int main()
34 {
35     int i;
36     int m = 1000000;
37     for (i = 1;i <= m;i ++)
38         cin >> a[i];
39     cin >> n;
40     ans = FindKth(1,m,n);
41     cout << a[ans];
42     return 0;
43 }

1.

正确答案: a[left]

2.

正确答案: a[j]<value

3.

正确答案: a[i]>value

4.

正确答案: a[i]=value;

5.

正确答案: i+1,right,n

6.

正确答案: FindKth(left,i–1,n);

这道题实在是不明白,像快速排序,分治算法,实在是看不懂,我现在还没有学到,听老师说它是D2的课程,还请大家多多指教。

  总结

  刷题就是照镜子”!我得感谢这些错题,让我及时的找到很多不足:1、计算机基础知识知道太少,2、现在学到D1,还有很多没有学过的C++知识,再有就是自己的马虎大意。所以我以后要多看一些有关计算机知识的书籍,尽快补一补,还要做事更加细心,严谨。我还得多学多问,多刷题,查缺补漏。最后我还是要相信自己,一定能够迎头赶上!加油!

原文地址:https://www.cnblogs.com/yanxinyi-cpp/p/12858545.html