第 1 题
在 Linux 系统中,如果你想显示当前工作目录的路径,应该使用哪个命令?( )
A. pwd
B. cd
C. ls
D. echo
本题共 2 分
第 2 题
假设一个长度为 nn 的整数数组中每个元素值互不相同,且这个数组是无序的。要找到这个数组中最大元素的时间复杂度是多少?( )
A. O(n)O(n)
B. O(logn)O(logn)
C. O(nlogn)O(nlogn)
D. O(1)O(1)
本题共 2 分
第 3 题
在 C++ 中,以下哪个函数调用会造成栈溢出?( )
A. int foo() { return 0; }
B. int bar() { int x = 1; return x; }
C. void baz() { int a[1000]; baz(); }
D. void qux() { return; }
本题共 2 分
第 4 题
在一场比赛中,有 1010 名选手参加,前三名将获得金、银、铜牌。若不允许并列,且每名选手只能获得一枚奖牌,则不同的颁奖方式共有多少种?
A. 120
B. 720
C. 504
D. 1000
本题共 2 分
第 5 题
下面哪个数据结构最适合实现先进先出(FIFO)的功能?( )
A. 栈
B. 队列
C. 线性表
D. 二叉搜索树
本题共 2 分
第 6 题
已知 f(1)=1f(1)=1,且对于 n≥2n≥2 有 f(n)=f(n−1)+f(⌊n/2⌋)f(n)=f(n−1)+f(⌊n/2⌋),则 f(4)f(4) 的值为?
A. 4
B. 5
C. 6
D. 7
本题共 2 分
第 7 题
假设有一个包含 nn 个顶点的无向图,且该图是欧拉图。以下关于该图的描述中哪一项不一定正确?
A. 所有顶点的度数均为偶数
B. 该图连通
C. 该图存在一个欧拉回路
D. 该图的边数是奇数
本题共 2 分
第 8 题
对数组进行二分查找的过程中,以下哪个条件必须满足?
A. 数组必须是有序的
B. 数组必须是无序的
C. 数组长度必须是 2 的幂
D. 数组中的元素必须是整数
本题共 2 分
第 9 题
考虑一个自然数 nn 以及一个模数 mm,你需要计算 nn 的逆元(即 nn 在模 mm 意义下的乘法逆元)。下列哪种算法最为适合?( )
A. 使用暴力法依次尝试
B. 使用扩展欧几里得算法
C. 使用快速幂法
D. 使用线性筛法
本题共 2 分
第 10 题
在设计一个哈希表时,为了减少冲突,需要使用适当的哈希函数和冲突解决策略。已知某哈希表中有 nn 个键值对,表的装载因子为 α(0<α≤1)α(0<α≤1)。在使用开放地址法解决冲突的过程中,最坏情况下查找一个元素的时间复杂度为( )?
A. O(1)O(1)
B. O(logn)O(logn)
C. O(1/(1−α))O(1/(1−α))
D. O(n)O(n)
本题共 2 分
第 11 题
假设有一棵 hh 层的完全二叉树,该树最多包含多少个结点?
A. 2h−12h−1
B. 2h+1−12h+1−1
C. 2h2h
D. 2h+12h+1
本题共 2 分
第 12 题
设有一个 1010 个顶点的完全图,每两个顶点之间都有一条边。有多少个长度为 44 的环?
A. 120
B. 210
C. 630
D. 5040
本题共 2 分
第 13 题
对于一个整数 nn,定义 f(n)f(n) 为 nn 的各位数字之和,问使 f(f(x))=10f(f(x))=10 的最小自然数 xx 是多少?
A. 29
B. 199
C. 299
D. 399
本题共 2 分
第 14 题
设有一个长度为 nn 的 0101 字符串,其中有 kk 个 11。每次操作可以交换相邻两个字符。在最坏情况下将这 kk 个 11 移到字符串最右边所需要的交换次数是多少?
A. kk
B. k×(k−1)/2k×(k−1)/2
C. (n−k)×k(n−k)×k
D. (2n−k−1)×k/2(2n−k−1)×k/2
本题共 2 分
第 15 题
如图是一张包含 77 个顶点的有向图,如果要删除其中一些边,使得从节点 11 到节点 77 没有可行路径,且删除的边数最少,请问总共有多少种可行的删除边的集合?( )
本题共 2 分
第 16 题
#include
using namespace std;
const int N = 1000;
int c[N];
int logic(int x, int y) {
return (x & y) ^ ((x ^ y) | (~x & y));
}
void generate(int a, int b, int *c) {
for (int i = 0; i < b; i++)
c[i] = logic(a, i) % (b + 1);
}
void recursion(int depth, int *arr, int size) {
if (depth <= 0 || size <= 1) return;
int pivot = arr[0];
int i = 0, j = size - 1;
while (i <= j) {
while (arr[i] < pivot) i++;
while (arr[j] > pivot) j--;
if (i <= j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++; j--;
}
}
recursion(depth - 1, arr, j + 1);
recursion(depth - 1, arr + i, size - i);
}
int main() {
int a, b, d;
cin >> a >> b >> d;
generate(a, b, c);
recursion(d, c, b);
for (int i = 0; i < b; ++i) cout << c[i] << " ";
cout << endl;
}
5 5 1
时,输出为 1 1 5 5 5
。( )int logic(int x, int y)
的功能是( )10 100 100
时,输出的第 100100 个数是?( )正确
B.错误
正确
B.错误
正确
B.错误
按位与
B.按位或
C.按位异或
D.以上都不是
91
B.94
C.95
D.98
本题共 11.5 分
第 17 题
#include
#include
using namespace std;
const int P = 998244353, N = 1e4 + 10, M = 20;
int n, m;
string s;
int dp[1 << M];
int solve() {
dp[0] = 1;
for (int i = 0; i < n; ++i) {
for (int j = (1 << (m - 1)) - 1; j >= 0; --j) {
int k = (j << 1) | (s[i] - '0');
if (j != 0 || s[i] == '1')
dp[k] = (dp[k] + dp[j]) % P;
}
}
int ans = 0;
for (int i = 0; i < (1 << m); ++i) {
ans = (ans + 1ll * i * dp[i]) % P;
}
return ans;
}
int solve2() {
int ans = 0;
for (int i = 0; i < (1 << n); ++i) {
int cnt = 0;
int num = 0;
for (int j = 0; j < n; ++j) {
if (i & (1 << j)) {
num = num * 2 + (s[j] - '0');
cnt++;
}
}
if (cnt <= m) (ans += num) %= P;
}
return ans;
}
int main() {
cin >> n >> m;
cin >> s;
if (n <= 20) {
cout << solve2() << endl;
}
cout << solve() << endl;
return 0;
}
假设输入的 ss 是包含 nn 个字符的 0101 串,完成下面的判断题和单选题。
solve()
所实现的算法的时间复杂度是 O(n×2m)O(n×2m)。( )11 2 10000000001
时,程序输出两个数 32 和 23。( )solve()
的返回值始终小于 410410。( )solve()
的最大可能返回值为( )?solve
和 solve2
的返回值的最大可能的差值为( )?正确
B.错误
正确
B.错误
正确
B.错误
10241024
B.1111
C.1010
D.00
6565
B.211211
C.665665
D.20592059
14771477
B.19951995
C.20592059
D.21872187
本题共 14 分
第 18 题
#include
#include
#include
using namespace std;
const int maxn = 1000000 + 5;
const int P1 = 998244353, P2 = 1000000007;
const int B1 = 2, B2 = 31;
const int K1 = 0, K2 = 13;
typedef long long ll;
int n;
bool p[maxn];
int p1[maxn], p2[maxn];
struct H {
int h1, h2, l;
H(bool b = false) {
h1 = b + K1;
h2 = b + K2;
l = 1;
}
H operator + (const H & h) const {
H hh;
hh.l = l + h.l;
hh.h1 = (1ll * h1 * p1[h.l] + h.h1) % P1;
hh.h2 = (1ll * h2 * p2[h.l] + h.h2) % P2;
return hh;
}
bool operator == (const H & h) const {
return l == h.l && h1 == h.h1 && h2 == h.h2;
}
bool operator < (const H & h) const {
if (l != h.l) return l < h.l;
else if (h1 != h.h1) return h1 < h.h1;
else return h2 < h.h2;
}
} h[maxn];
void init() {
memset(p, 1, sizeof(p));
p[0] = p[1] = false;
p1[0] = p2[0] = 1;
for (int i = 1; i <= n; ++i) {
p1[i] = (1ll * B1 * p1[i-1]) % P1;
p2[i] = (1ll * B2 * p2[i-1]) % P2;
if (!p[i]) continue;
for (int j = 2 * i; j <= n; j += i) {
p[j] = false;
}
}
}
int solve() {
for (int i = n; i; --i) {
h[i] = H(p[i]);
if (2 * i + 1 <= n) {
h[i] = h[2 * i] + h[i] + h[2 * i + 1];
} else if (2 * i <= n) {
h[i] = h[2 * i] + h[i];
}
}
cout << h[1].h1 << endl;
sort(h + 1, h + n + 1);
int m = unique(h + 1, h + n + 1) - (h + 1);
return m;
}
int main() {
cin >> n;
init();
cout << solve() << endl;
}
maxn
改为 n+1
,所实现的算法的时间复杂度是 O(nlogn)O(nlogn)。( )init()
函数。( )B1
或 K1
的值,该程序可能会输出不同的结果。( )solve()
函数中,h[]
的合并顺序可以看作是( )?正确
B.错误
正确
B.错误
正确
B.错误
二叉树的 BFS 序
B.二叉树的先序遍历
C.二叉树的中序遍历
D.二叉树的后序遍历
8383
B.424424
C.5454
D.110101000110101000
77
B.99
C.1010
D.1212
本题共 13.5 分
第 19 题
(序列合并) 有两个长度为 NN 的单调不降序列 AA 和 BB,序列的每个元素都是小于 109109 的非负整数。在 AA 和 BB 中各取一个数相加可以得到 N2N2 个和,求其中第 KK 小的和。上述参数满足 N≤105N≤105 和 1≤K≤N21≤K≤N2。
#include
using namespace std;
const int maxn = 100005;
int n;
long long k;
int a[maxn], b[maxn];
int* upper_bound(int *a, int *an, int ai) {
int l = 0, r = ___①___;
while (l < r) {
int mid = (l+r)>>1;
if (___②___) {
r = mid;
} else {
l = mid + 1;
}
}
return ___③___;
}
long long get_rank(int sum) {
long long rank = 0;
for (int i = 0; i < n; ++i) {
rank += upper_bound(b, b+n, sum - a[i]) - b;
}
return rank;
}
int solve() {
int l = 0, r = ___④___;
while (l < r) {
int mid = ((long long)l+r)>>1;
if (___⑤___) {
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> b[i];
cout << solve() << endl;
}
an-a
an-a-1
ai
ai+1
a[mid] > ai
a[mid] >= ai
a[mid] < ai
a[mid] <= ai
a+l
a+l+1
a+l-1
an-l
a[n-1]+b[n-1]
a[n]+b[n]
2 * maxn
maxn
get_rank(mid) < k
get_rank(mid) <= k
get_rank(mid) > k
get_rank(mid) >= k
an-a
an-a-1
ai
ai+1
a[mid] > ai
a[mid] >= ai
a[mid] < ai
a[mid] <= ai
a+l
a+l+1
a+l-1
an-l
a[n-1]+b[n-1]
a[n]+b[n]
2 * maxn
maxn
get_rank(mid) < k
get_rank(mid) <= k
get_rank(mid) > k
get_rank(mid) >= k
本题共 15 分
第 20 题
(次短路) 已知一个有 nn 个点 mm 条边的有向图 GG,并且给定图中的两个点 ss 和 tt,求次短路(长度严格大于最短路的最短路径)。如果不存在,输出一行 −1−1。如果存在,输出两行,第一行表示次短路的长度,第二行表示次短路的一个方案。
#include
#include
#include
#include
using namespace std;
const int maxn = 2e5+10, maxm = 1e6+10, inf = 522133279;
int n, m, s, t;
int head[maxn], nxt[maxm], to[maxm], w[maxm], tot = 1;
int dis[maxn<<1], *dis2;
int pre[maxn<<1], *pre2;
bool vis[maxn<<1];
void add(int a, int b, int c) {
++tot;
nxt[tot] = head[a];
to[tot] = b;
w[tot] = c;
head[a] = tot;
}
bool upd(int a, int b, int d, priority_queue> &q) {
if (d >= dis[b]) return false;
if (b < n) ___①___;
q.push(___②___);
dis[b] = d;
pre[b] = a;
return true;
}
void solve() {
priority_queue> q;
q.push(make_pair(0, s));
memset(dis, ___③___, sizeof(dis));
memset(pre, -1, sizeof(pre));
dis2 = dis+n;
pre2 = pre+n;
dis[s] = 0;
while (!q.empty()) {
int aa = q.top().second; q.pop();
if (vis[aa]) continue;
vis[aa] = true;
int a = aa % n;
for (int e = head[a]; e; e = nxt[e]) {
int b = to[e], c = w[e];
if (aa < n) {
if (!upd(a, b, dis[a]+c, q))
___④__;
} else {
upd(n+a, n+b, dis2[a]+c, q);
}
}
}
void out(int a) {
if (a != s) {
if (a < n) out(pre[a]);
else out(___⑤___);
}
printf("%d%c", a%n+1, " \n"[a == n+t]);
}
int main() {
scanf("%d%d%d", &n, &m, &s, &t);
s--, t--;
for (int i = 0; i < m; ++i) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add(a-1, b-1, c);
}
solve();
if (dis2[t] == inf) puts("-1");
else {
printf("%d\n", dis2[t]);
out(n+t);
}
}
① 处应填( )
A. upd(pre[b], n+b, dis[b], q)
B. upd(a, n+b, d, q)
C. upd(pre[b], b, dis[b], q)
D. upd(a, b, d, q)
② 处应填( )
A. make_pair(-d, b)
B. make_pair(d, b)
C. make_pair(b, d)
D. make_pair(-b, d)
③ 处应填( )
A. 0xff
B. 0x1f
C. 0x3f
D. 0x7f
④ 处应填( )
A. upd(a, n+b, dis[a]+c, q)
B. upd(n+a, n+b, dis2[a]+c, q)
C. upd(n+a, b, dis2[a]+c, q)
D. upd(a, b, dis[a]+c, q)
⑤ 处应填( )
A. pre2[a%n]
B. pre[a%n]
C. pre2[a]
D. pre[a%n]+1
upd(pre[b], n+b, dis[b], q)
upd(a, n+b, d, q)
upd(pre[b], b, dis[b], q)
upd(a, b, d, q)
make_pair(-d, b)
make_pair(d, b)
make_pair(b, d)
make_pair(-b, d)
0xff
0x1f
0x3f
0x7f
upd(a, n+b, dis[a]+c, q)
upd(n+a, n+b, dis2[a]+c, q)
upd(n+a, b, dis2[a]+c, q)
upd(a, b, dis[a]+c, q)
pre2[a%n]
pre[a%n]
pre2[a]
pre[a%n]+1
本题共 15 分