2020年5月9号,我做了一套NOIP 2008 普及组初赛试题。两个小时28道题,我仅仅对了18道,得了53分,有点惨。但是爸爸说:“刷题就是照镜子”,虽然比较惨不忍睹,但是却让我发现了许多许多的不足。现在整理一下,把错题搞定,下次不错!
错题1:
Web2.0是近年来互联网的热门概念之一,其核心思想是互动与分享。下列网站中,( )是典型的Web2.0应用。
错题2:
递归过程或函数调用时,处理参数和返回地址,通常使用一种称为( )的数据结构。
错题3:
二叉树T,已知其先根遍历是1 2 4 3 5 7 6(数字为结点的编号,以下同),中根遍历是2 4 1 5 7 3 6,则该二叉树的后根遍历是( )。
错题4:
面向对象程序设计(Object-Oriented Programming)是一种程序设计的方法论,它将对象作为程序的基本单元,将数据和程序封装在对象中,以提高软件的重用性、灵活性和扩展性。下面关于面向对象程序设计的说法中,不正确的是( )。
错题5:
下列不属于NOIP竞赛推荐使用的语言环境的是( )。
错题6:
在C++程序中,表达式200|10的值是( )。
10:1010 按位进行或运算11001010 ,十进制就是202了 。
错题7:
有6个城市,任何两个城市之间都有一条道路连接,6个城市两两之间的距离如下表所示,则城市1到城市6的最短距离为_____________。
错题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
错题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 }
错题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.
2.
3.
4.
正确答案: a[i]=value;
5.
正确答案: i+1,right,n
6.
正确答案: FindKth(left,i–1,n);
这道题实在是不明白,像快速排序,分治算法,实在是看不懂,我现在还没有学到,听老师说它是D2的课程,还请大家多多指教。
总结
“刷题就是照镜子”!我得感谢这些错题,让我及时的找到很多不足:1、计算机基础知识知道太少,2、现在学到D1,还有很多没有学过的C++知识,再有就是自己的马虎大意。所以我以后要多看一些有关计算机知识的书籍,尽快补一补,还要做事更加细心,严谨。我还得多学多问,多刷题,查缺补漏。最后我还是要相信自己,一定能够迎头赶上!加油!