试卷总分:100分
选择题 15题 30分
阅读程序 17题 40分
完善程序 10题 30分
01 #include <iostream> 02 using namespace std; 03 void hanoi(int n,char a,char b,char c) { 04 if (n == 1) 05 cout << n << " : " << a << " --> " << c << endl; 06 else { 07 hanoi(n-1, a, c, b); 08 cout << n << " : " << a << " --> " << c << endl; 09 hanoi(n-1, b, a, c); 10 } 11 } 12 int main() { 13 int n; 14 cin >> n; 15 hanoi(n, 'A', 'B', 'C'); 16 return 0; 17 }
当 n >= 0 时,程序不会出现死循环。
01 #include <cstdio> 02 using namespace std; 03 #define N 1005 04 int num[N]; 05 int main() { 06 int a1 = 1, n, x; 07 scanf("%d", &n); 08 num[1] = 1; 09 for (int i=1; i<=n; ++i) { 10 x = 0; 11 for (int j=1; j<=a1; ++j) { 12 num[j] = num[j] * 5 + x; 13 x = num[j] / 10; 14 num[j] %= 10; 15 } 16 if (x > 0) num[++a1] = x; 17 } 18 printf("0"); 19 for (int i=a1; i<=n; ++i) putchar('0'); 20 for (int i=a1; i>=1; i--) printf("%d", num[i]); 21 putchar('\n'); 22 return 0; 23 }
程序输出的是 5^n 的值。
01 #include <iostream> 02 using namespace std; 03 int l,n,m,a [50005], ans; 04 bool check(int dis) { 05 int count=0, last =0; 06 for (int i=1; i<=n+1; i++) 07 if (a[i] - last < dis) count++; 08 else last = a[i]; 09 if (count > m) return 0; 10 return 1; 11 } 12 13 int main() { 14 // 输入保证 l,n,m,a[i] 是正整数,且 a[i] 严格递增 15 cin >> l >> n >> m; 16 for (int i=1; i<=n; i++) cin >> a[i]; 17 a[n+1] = l; 18 int fl = 0, fr = l; 19 while (fl <= fr) { 20 int mid = (fl + fr) / 2; 21 if (check(mid)) fl=mid+1, ans=mid; 22 else fr=mid-1; 23 } 24 cout << ans << endl; 25 return 0; 26 }
将 main() 函数中 while 之前的 fl = 0 改为 fl = 1,程序输出结果必定不变。
01 #include <iostream> 02 using namespace std; 03 int main() { 04 int edges; 05 int points; 06 int dis[10]; 07 int flag[10]; 08 int infinity=9999999; 09 cin >> points >> edges; 10 int edg[10][10]; 11 for (int i=1; i<=points; i++) { 12 for (int j=1; j<=points; j++) { 13 if (i == j) { 14 edg[i][j] = ①; 15 } else { 16 edg[i][j] = ②; 17 } 18 } 19 } 20 int point1, point2, quanzhi; 21 for (int i=1;i<=edges; i++) { 22 cin >> point1 >> point2 >> quanzhi; 23 edg[point1][point2] = ③; 24 } 25 for (int i=1; i<=points; i++) dis[i] = edg[1][i]; 26 for (int i=1; i<=points; i++) flag[i]=0; 27 flag[1]=1; 28 int min,u; 29 for (int i=1; i<=points-1; i++) { 30 // 源点到源点不用比较,因此总的次数少一次 31 min = infinity; 32 for (int j=1; j<=points; j++) { 33 if (flag[j]==0 && dis[j]<min) { 34 // 核心思想:依次比较出离源点最近的点 35 min = ④; 36 u=j; 37 } 38 } 39 flag[u] = 1; 40 for (int v=1; v<=points; v++) { 41 // 找出离源点最近的点后,更新 dis 里面的源点到各个点的值是否最小 42 if (edg[u][v] < infinity) { 43 if (dis[v] > dis[u] + edg[u][v]) { 44 dis[v] = ⑤; 45 } 46 } 47 } 48 } 49 for (int i=1; i<=points; i++) cout << dis[i]<<" "; 50 cout << endl; 51 return 0; 52 }
① 处应填 ( )。
01 #include <iostream> 02 #include <algorithm> 03 using namespace std; 04 int main() { 05 int total_weight=10; 06 int w[6] = {0,5,4,3,2,1}; 07 int v[6] = {0,1,2,3,4,5}; 08 int dp[11] = { ① }; 09 for (int i=1; i<=2; i++) 10 for (int j=w[i]; j<=③; j++) 11 dp[j] = ④; 12 cout << ⑤ << endl; 13 return 0; 14 }