假设输入的 x 、 y 均是不超过 15 的自然数,完成下面的判断题和单选题:
判断题
16. 删去第 7 行与第 13 行的 unsigned ,程序行为不变。( )
17. 将第 7 行与第 13 行的 short 均改为 char ,程序行为不变。( )
18. 程序总是输出一个整数“ 0 ”。( )
19. 当输入为“ 2 2 ”时,输出为“ 10 ”。( )
20. 当输入为“ 2 2 ”时,输出为“ 59 ”。( )
单选题
21. 当输入为“ 13 8 ”时,输出为( )。
A. “ 0 ”
B. “ 209 ”
C. “ 197 ”
D. “ 226 ”
16.【答案】对【解析】本程序考查位运算的知识点。unsigned short 表示无 符号短整型,数据范围为 0 ~ 65535,占 2 个字节。| 为按位或运 算,& 为按位与运算,<< 为左移运算。需要注意的是 << 运算优 先级高于 |。0x33 表示 十六进制的33,即十进制的510x55 表示十六机制的 55,即十进制的85
17、【答案】 ×【解析】输入为不超过 15 的自然数,改为 char 以 后,当输入为两位数时,x,y 分别读入的是第一个数的十位和个位, 改变了程序的行为和结果。
18、【答案】 ×【解析】略
19、【答案】 ×【解析】代入"2 2",输出结果为"12"。
20、【答案】×【解析】略
21、【答案】B【解析】代入"13 8",输出结果为"209"
#include <algorithm>
#include <iostream>
#include <limits>
using namespace std;
const int MAXN=105;
const int MAXK=105;
int h[MAXN][MAXK];
int f(int n,int m)
{
if(m==1) return n;
if(n==0) return 0;
int ret=numeric_limits<int>::max();
for(int i=1;i<=n;i++)
ret=min(ret,max(f(n-i,m),f(i-1,m-1))+1);
return ret;
}
int g(int n,int m)
{
for(int i=1;i<=n;i++)
h[i][1]=i;
for(int j=1;j<=m;j++)
h[0][j]=0;
for(int i=1;i<=n;i++){
for(int j=2;j<=m;j++){
h[i][j]=numeric_limits<int>::max();
for(int k=1;k<=i;k++)
h[i][j]=min(
h[i][j],
max(h[i-k][j],h[i-1][j-1])+1);
}
}
return h[n][m];
}
int main()
{
int n,m;
cin>>n>>m;
cout<<f(n,m)<<endl<<g[n,m]<<endl;
return 0;
}
假设输入的 n 、 m 均是不超过 100 的正整数,完成下面的判断题和单选题:
判断题
22. 当输入为“ 7 3 ”时,第 19 行用来取最小值的 min 函数执行了 449 次。( )
23. 输出的两行整数总是相同的。( )
24. 当 m 为 1 时,输出的第一行总为 n 。( )
单选题
25. 算法 g(n,m) 最为准确的时间复杂度分析结果为( )。
A. O ( n 3 2 /