10.1.56.23 第一段是 10,落在 1~126,所以是 A 类地址。172.15.34.128 第一段是 172,落在 128~191,所以是 B 类地址。192.168.32.17 第一段是 192,落在 192~223,所以是 C 类地址,符合题意。172.128.45.34 第一段也是 172,所以同样是 B 类地址,不是 C 类地址。cp 命令的作用是( )cp 是 copy 的缩写,用于复制文件或目录。touch 命令,例如 touch a.txt 可更新文件时间。mkdir 命令,例如 mkdir test。cp 命令,例如 cp a.txt b.txt。cat、less 或 more,例如 cat a.txt。1240*720、1920*1080、1600*900 三个分辨率交替存储,每张图片均为 32 位图像,则这个文件夹最少要用( )GB 的 U 盘存储。1000=333*3+1,所以第一种分辨率有 334 张,第二种和第三种各 333 张。32 位图像每像素 4 字节,总容量为 334*1240*720*4 + 333*1920*1080*4 + 333*1600*900*4 = 5872896000 字节,约为 5.87GB,因此至少要选 6GB。C_n = (2n)!(n+1)! * n!。本题 n=6,所以 C_6 = 12!7! * 6! = 132。2^5-1=31 个结点,第 6 层有 8 个叶子结点,总数最少为 31+8=39。n 个顶点和 n 条边组成的无向图一定是( )n-1 条边;题目中已有 n 条边,超过了无环无向图的最大边数,所以一定存在环。HBDIAEFCG,先序遍历为 ABHDICEFG,则该二叉树的后序遍历为( )HBDI,右边是右子树 EFCG。还原出的二叉树如下:按后序遍历“左子树、右子树、根”:左子树为 HIDB,右子树为 FEGC,最后加根 A,得到 HIDBFEGCA。23|15+9^16&69 的结果是( )15+9=24、16&69=16,再算 24^16=8,最后 23|8=31。{73,94,46,20,77,61,51,28,81,58},使用快速排序进行排序,以第一个记录为基准值,第一次划分结果为( )int y=0;while((y+1)*(y-1)<=n){ y++;}y^2<=n,所以循环次数与 sqrt(n) 同阶。
(b,c)、(e,d)、(e,b);接着 (c,d) 会使 c-b-e-d-c 成环,不能加入;最后加入 (d,a)。因此真正加入最小生成树的是 (b,c),(e,d),(e,b),(d,a)。C(3,2)×(25)2×35=36125。int 和 short 长度范围分别为 32 位和 16 位,执行以下代码:unsigned short x=65530;unsigned int y=x;y 的机器码为( )FFFAH,转换为 32 位无符号整数时高位补 0,得到 0000 FFFAH。#include <bits/stdc++.h>long long n, m, t, a[1000005];using namespace std;int main() { cin >> n >> m; while (m > 0) { t++; m--; if (m <= 0) break; a[t] = a[t - 1] + 1; while (m > (1 << n - a[t]) && a[t] <= n) { m -= 1 << n - a[t]; a[t]++; } } if (t != 1) for (int i = 1; i < t; i++) cout << a[i] << " "; else puts("0"); return 0;}代码功能:这段程序把输入的 m 按照一段一段的块大小进行拆分,逐步确定数组 a 中的若干值,最后输出 a[1] 到 a[t-1]。如果循环只执行了一轮,则输出 0。
n 控制块大小中的指数,程序多次使用 1 << (n-a[t]),也就是 2^(n-a[t])。m 是不断被消耗的值。每进入一轮外层循环,先令 t++,再令 m--。a[t] = a[t-1] + 1 表示当前选出的值至少比前一个值大 1,所以 a 数组整体呈递增趋势。while 会比较 m 和当前块大小 2^(n-a[t])。如果 m 还大,就减去这一块,并把 a[t] 继续增大。t != 1 时,程序输出已经确定好的 a[1..t-1];否则说明没有形成有效序列,输出 0。"0" 改成 '0',程序运行会报错。( )puts 需要的是字符串地址,"0" 是字符串常量;'0' 是字符常量,类型不匹配,会导致编译错误。n 为负整数,并且程序执行到第 12 行的 1 << (n - a[t]),则可能出现负数移位,程序行为不能保证。( )1 << (n-a[t])。当 n-a[t] 为负数时,会出现负数移位,属于未定义行为,因此不能保证程序正常输出。a 数组求前缀和。( )n 最大可以到 1000000。( )1000005,但程序还使用 1 << (n-a[t])。当 n 很大时,移位位数远超整型范围,不能支持 n=1000000。4 12,输出( )a[1]=2,第二次得到 a[2]=3,第三次得到 a[3]=4,最后输出 2 3 4。n 为 3,m 为 1~8 之间的整数时,平均输出整数的个数(保留一位小数)是( )。m=1..8 模拟,输出整数个数依次为 1,1,2,3,2,1,2,1,总数为 13,平均为 13/8=1.625,保留一位小数为 1.6。#include <iostream>#include <cstring>using namespace std;string a,b;int f[2010][2010];int Dfs(int i, int j){ if(f[i][j]!=-1) return f[i][j]; if(i==0) return f[i][j]=j; if(j==0) return f[i][j]=i; int c=1; if(a[i-1]==b[j-1]) c=0; return f[i][j]=min(min(Dfs(i-1,j)+1,Dfs(i,j-1)+1),Dfs(i-1,j-1)+c);}int main(){ cin>>a>>b; memset(f,-1,sizeof(f)); int len1=a.length(),len2=b.length(); Dfs(len1,len2); cout<<f[len1][len2]; return 0;}代码功能:这段程序计算两个字符串的编辑距离,也就是把字符串 a 变成字符串 b 所需的最少操作次数。
f[i][j] 表示 a 的前 i 个字符和 b 的前 j 个字符之间的最小编辑距离。memset(f,-1,sizeof(f)) 把所有状态标记为“还没有计算过”,配合第 7 行实现记忆化搜索。i==0,说明第一个串为空,只能插入 j 个字符;如果 j==0,说明第二个串为空,只能删除 i 个字符。c 表示最后一个字符是否需要替换:相同则 c=0,不同则 c=1。Dfs(len1,len2),最终输出完整两个字符串的编辑距离。-1 如果改成 -2,程序运行结果可能不一样。( )memset 按字节填充。若改为 memset(f,-2,sizeof(f)),整数数组元素并不会被可靠地设置为数值 -2,与第 7 行的判断配合后可能直接返回错误值。n 是输入两个字符串长度的最大值,程序的时间复杂度为 log(n)。( )i,j,状态数量约为 len1×len2,若最大长度为 n,时间复杂度约为 O(n^2)。-1。( )-1 只是未计算状态的标记。len1 和 len2 为执行完第 21 行后的值,则程序输出的最大值为 len1+len2。( )len1+len2;通常可以用替换配合插入或删除完成,结果不超过 max(len1,len2)。sfdqxbw gfdgw,输出( )。sfdqxbw 到 gfdgw 的最少编辑次数为 4。a~z,第一个字符串为 acegikmoqsuwyace...uwy...ace...moq,第二个字符串为 abcdefghijklmnopqrstuvwxy...abc...wxyabcd(... 表示省略了中间的字符),输出为( )n 的数列:a1, a2, ..., an,如果其中一段连续的子序列 ai, ai+1, ..., aj (i <= j) 中,奇数比偶数多,我们就称这个区间 [i,j] 是奇数区间。求给定的 n 个数中有多少个奇数区间。#include<bits/stdc++.h>using namespace std;const int off = 1e6 + 1;const int maxn = 1e6 + 5;int a[maxn], s[maxn], c[2 * maxn];int n;long long ans;int lowbit(int x){ return x & -x;}long long getSum(int x){ long long res = 0; while(x > 0){ res += c[x]; ① ; } return res;}void add(int x, int k){ while( ② ){ c[x] += k; ③ ; }}int main(){ cin >> n; add(off, 1); for(int i = 1; i <= n; i++){ cin >> a[i]; s[i] = ④ ; ans += getSum( ⑤ ); add(s[i] + off,1); } cout << ans << endl; return 0;}代码功能:这段程序统计数列中有多少个“奇数比偶数多”的连续区间。
+1,偶数看成 -1。这样一个区间的和大于 0,就表示这个区间里奇数比偶数多。s[i] 是前缀和。区间 [l,r] 的和为 s[r]-s[l-1],它大于 0 等价于 s[r] > s[l-1]。i 时,只要统计之前出现过多少个前缀和严格小于当前 s[i],就能得到以 i 结尾的奇数区间数量。c 是树状数组,用来维护已经出现过的前缀和次数;off 用来把可能为负的前缀和整体平移成正下标。getSum(x) 查询小于等于某个下标的前缀和数量;add(x,k) 把某个前缀和出现次数加上 k。s[0]=0 需要先加入,所以程序开始时执行 add(off,1)。x -= lowbit(x)。off 平移,范围上界使用 2*off。x += lowbit(x)。+1,偶数看作 -1,所以当前前缀和应写成 s[i-1] + (a[i]%2!=0 ? 1 : -1)。括号是必要的,否则三目运算符可能被解析到整个表达式外层。s[i] 大于某个之前的前缀和,因此需要统计严格小于 s[i] 的前缀和数量,即查询到 s[i]+off-1。