自己的东西
6
题目答案
C
题目解析
举例根节点所有的情况:
8
题目答案
C
题目解析
在数组中,如果 i < ji<j 但 a[i] > a[j]a[i]>a[j],我们称其为一对逆序对。根据题目意思每交换一次会减少一个逆序对,所以交换次数等于逆序对数 = 10=10。
16
题目答案
D
题目解析
地址总线 Address Bus 是专门用来传送地址的,由于地址只能从 CPU 传向外部存储器或 I/O 端口,所以地址总线总是单向三态的,这与数据总线不同。地址总线的位数决定了 CPU 可直接寻址的内存空间大小,比如 88 位微机的地址总线为 1616 位,则其最大可寻址空间为 2^{16}=64216=64KB,1616 位微型机的地址总线为 2020 位,其可寻址空间为 2^{20}=1220=1MB。一般来说,若地址总线为 nn 位,则可寻址空间为 2^n2n 字节。3232 位 X86 架构是指个人电脑的地址总线是 3232 位的,CPU、内存控制器、操作系统都是按 3232 位地址总线设计。3232 位地址总线可以支持的内存地址代码是 40964096MB,也就是有 44GB的地址代码。当然,如果对这些基础知识不了解的话,我们也可以根据题目条件计算 6464KB\times 2^{32-16} = 4194304×232−16=4194304KB= 4096=4096MB= 4=4GB。
21
题目答案
5
题目解析
分析一下两个点的中点是整点有什么性质,(x_1,y_1)(x1,y1),(x_2,y_2)(x2,y2) 的中点是 (x_1+x_2/2,y_1+y_2/2)(2x1+x2,2y1+y2),要求中点是整点,所以 (x_1 + x_2)(x1+x2),(y_1 + y_2)(y1+y2) 均要是偶数。所以从整点坐标的奇偶性来讨论,只有(奇,偶)(奇,奇)(偶,奇)(偶,偶)四种情况,由抽屉原理得,至少要 55 个点。
22
题目答案
2880
题目解析
先让大陆选手坐成一周的排列方法有 N_1=P^5_5/5N1=5P55,港澳选手插入到5个空中的排列种数有 N_2=P_5^5N2=P55,就坐方案的总数是 N=N_1\times N_2=2880N=N1×N2=2880。
25
题目答案
14
题目解析
这个程序是在找一条从 (1,1)(1,1) 到 (n,x)(1\le x\le n)(n,x)(1≤x≤n) 开始的和最大的路径,每次只能从 (i, j)(i,j) 走到 (i+1, j)(i+1,j) 或 (i+1, j+1)(i+1,j+1)。
27
(坐标统计)输入 nn 个整点在平面上的坐标。对于每个点,可以控制所有位于它左下方的点(即 xx、yy 坐标都比它小),它可以控制的点的数目称为“战斗力”。依次输出每个点的战斗力,最后输出战斗力最高的点的编号(如果若干个点的战斗力并列最高,输出其中最大的编号)。
#include<iostream>
using namespace std;
const int SIZE = 100;
int x[SIZE], y[SIZE], f[SIZE];
int n, i, j, max_f, ans;
int main(){cin>>n;for (i = 1; i <= n; i++)cin >> x[i] >> y[i];max_f = 0;for (i = 1; i <= n; i++){f[i] =①;for (j = 1; j <= n; j++){if (x[j] < x[i] && ②)③;}if (④){max_f = f[i];⑤;}}for (i = 1; i <= n; i++)cout<<f[i]<<endl;cout<<ans<<endl;
}
题目答案
填空位置 ①:
0
填空位置 ②:
y[j] < y[i]
填空位置 ③:
f[i]++
填空位置 ④:
f[i] >= max_f
填空位置 ⑤:
ans = i
题目解析
先大致浏览一遍,可以得出,f[i]f[i] 应该是第 ii 个点的战斗力大小,ansans 应该是战斗力最高的点的编号,max_fmaxf 是战斗力最高的点的战斗力。所以第一空明显应该是赋初值,第二三五三空都比较简单,关键在于第四空,要注意题目中说到,战斗力相同要取编号大的,所以应该要加等于号。
28
(排列数)输入两个正整数 n, m (1 \le n \le 20, 1 \le m \le n)n,m(1≤n≤20,1≤m≤n),在 11~nn 中任取 mm 个数,按字典序从小到大输出所有这样的排列。
例如输入:
3 2
输出:
1 2
1 3
2 1
2 3
3 1
3 2
#include<iostream>
#include<cstring>
using namespace std;
const int SIZE = 25;
bool used[SIZE];
int data[SIZE];
int n, m, i, j, k;
bool flag;
int main(){cin>>n>>m;memset(used, false, sizeof(used));for (i = 1; i <= m; i++){data[i] = i;used[i] = true;}flag = true;while (flag){for (i = 1; i <= m-1; i++)cout<<data[i]<<"";cout << data[m] << endl;flag =①;for (i = m; i >= 1; i--){②;for (j = data[i]+1; j <= n; j++)if (!used[j]){used[j] = true;data[i] =③;flag = true;break;}if (flag){for (k = i+1; k <= m; k++)for (j = 1; j <=④; j++)if (!used[j]){data[k] = j;used[j] = true;break;}⑤;}}}
}
题目答案
填空位置 ①:
false
填空位置 ②:
used[data[i]] = false
填空位置 ③:
j
填空位置 ④:
n
填空位置 ⑤:
break
题目解析
used[i] == 0
表示数字i还没有被使用过,每次倒着找到第一个能变大的数字然后变大,接着把后面的数字直接从小到大安排,就生成了一个新的组合。flagflag 是标记能不能找到一个新的排列,第一层的循环意义是把排列中的第 ii 位给它清零就是第二个空的作用,如果找到一个排列就把后面的排列补全(在剩余的元素中找到最小的排列)然后跳出循环,就是第四和第五个空的意思。