今天我做了一套NOIP2010年初赛的真题,由于在空闲时间中爸爸给我讲了很多初赛可能考到的计算机常识,所以这次的刷题比之前的有所进步,28道题考了71分,错了4个,但还有进步的空间,希望大家多多指教。下面呢我就整理一下我的错题。虽然错题是你成功路上的绊脚石,但是也要对错题说声:谢谢!因为它好不留情面地告诉了你现在的不足。
错题1:
双向链表中有两个指针域llink和rlink,分别指向该结点的前驱及后继。设p指向链表中的一个结点,它的左右结点均非空。现要求删除结点p,则下面语句序列中错误的是( )。
p->rlink->llink = p->rlink;
p->llink->rlink = p->llink; delete p;
p->llink->rlink = p->rlink;
p->rlink->llink = p->llink; delete p;
p->rlink->llink = p->llink;
p->rlink->llink->rlink = p->rlink; delete p;
p->llink->rlink = p->rlink;
p->llink->rlink->llink = p->llink; delete p;
关于拓扑排序,下面说法正确的是( )。
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 const int SIZE = 1000; 7 8 int n, r, p[SIZE], i, j, k, ans; 9 bool tmp; 10 11 cin>>n; 12 r = 1; 13 p[1] = 2; 14 for (i = 3; i <= n; i++) { 15 [ ① ]; 16 for (j = 1; j <= r; j++) 17 if (i % [ ② ] == 0) { 18 tmp = false; 19 break; 20 } 21 if (tmp) { 22 r++; 23 [ ③ ] ; 24 } 25 } 26 27 ans = 0; 28 for (i = 2; i <= n / 2; i++) { 29 tmp = false; 30 for (j = 1; j <= r; j++) 31 for (k = j; k <= r; k++) 32 if (i + i == [ ④ ] ) { 33 tmp = true; 34 break; 35 } 36 if (tmp) 37 ans++; 38 } 39 cout<<ans<<endl; 40 return 0; 41 }
若输入n为2010,则输出[ ⑤ ]时表示验证成功,即大于2且不超过2010的偶数都满足哥德巴赫猜想。
1.
2.
正确答案: p[j]
3.
正确答案: p[r]=i
4.
正确答案: p[j]+p[k] / p[k]+p[j]
5.
正确答案: 1004
哥德巴赫猜想的代码我之前写过,只需要写一个判断质数的函数,再循环枚举判断就行,但这道题的思路我怎么也没看明白,最后导致没做上。
错题4:
完善程序:1 #include <iostream> 2 using namespace std; 3 4 const int SIZE = 100; 5 const int INFINITY = 10000; 6 const bool LEFT = true; 7 const bool RIGHT = false; 8 const bool LEFT_TO_RIGHT = true; 9 const bool RIGHT_TO_LEFT = false; 10 11 int n, hour[SIZE]; 12 bool pos[SIZE]; 13 14 int max(int a, int b) 15 { 16 if (a > b) 17 return a; 18 else 19 return b; 20 } 21 22 int go(bool stage) 23 { 24 int i, j, num, tmp, ans; 25 if (stage == RIGHT_TO_LEFT) { 26 num = 0; 27 ans = 0; 28 for (i = 1; i <= n; i++) 29 if (pos[i] == RIGHT) { 30 num++; 31 if (hour[i] > ans) 32 ans = hour[i]; 33 } 34 if ([ ① ]) 35 return ans; 36 ans = INFINITY; 37 for (i = 1; i <= n - 1; i++) 38 if (pos[i] == RIGHT) 39 for (j = i + 1; j <= n; j++) 40 if (pos[j] == RIGHT) { 41 pos[i] = LEFT; 42 pos[j] = LEFT; 43 tmp = max(hour[i], hour[j]) +[ ② ]; 44 if (tmp < ans) 45 ans = tmp; 46 pos[i] = RIGHT; 47 pos[j] = RIGHT; 48 } 49 return ans; 50 } 51 if (stage == LEFT_TO_RIGHT) { 52 ans = INFINITY; 53 for (i = 1; i <= n; i++) 54 if ([ ③ ]) { 55 pos[i] = RIGHT; 56 tmp =[ ④ ]; 57 if (tmp < ans) 58 ans = tmp; 59 [ ⑤ ]; 60 } 61 return ans; 62 } 63 return 0; 64 } 65 66 int main() 67 { 68 int i; 69 70 cin>>n; 71 for (i = 1; i <=n; i++) { 72 cin>>hour[i]; 73 pos[i] = RIGHT; 74 } 75 cout<<go(RIGHT_TO_LEFT)<<endl; 76 return 0; 77 }
1.
2.
正确答案: go(LEFT_TO_RIGHT)
3.
正确答案: pos[i] == LEFT / LEFT == pos[i]
4.
正确答案: hour[i] + go(RIGHT_TO_LEFT) / go(RIGHT_TO_LEFT) + hour[i]
5.
正确答案: pos[i] = LEFT
原文:https://www.cnblogs.com/yanxinyi-cpp/p/12902571.html