蓝桥杯 2022年国赛真题
C/C++ 大学B组

  • 试题 A: 2022
  • 试题 B: 钟表
  • 试题 C: 卡牌
  • 试题 D: 最大数字
  • 试题 E: 出差
  • 试题 F: 费用报销
  • 试题 G: 故障
  • 试题 H: 机房
  • 试题  I: 齿轮
  • 试题 J: 搬砖

   更新中…


试题 A: 2022

本题总分:555 分


【问题描述】

  将 202220222022 拆分成 101010 个互不相同的正整数之和,总共有多少种拆分方法?

  注意交换顺序视为同一种方法,例如 2022=1000+10222022 = 1000 + 10222022=1000+1022 和 2022=1022+10002022 = 1022 + 10002022=1022+1000 就视为同一种方法。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个由大写字母组成的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。


379187662194355221


k 部分互异分拆数


  定义 pdknpd_knpdk​n 为 nnn 分拆成 kkk 个不同的部分的方案数,即下列方程:::n=r1+r2+⋯+rk,r1>r2>⋯>rk≥1n = r_1 +r_2 + \cdots +r_k,\quad r_1 > r_2 >\cdots>r_k \geq 1n=r1​+r2​+⋯+rk​,r1​>r2​>⋯>rk​≥1  的解的数量,两边同时减去 kkk:::n−k=d1+d2+⋯+dk,d1>d2>⋯>dk≥0,n - k = d_1 +d_2 + \cdots +d_k,\quad d_1 > d_2 >\cdots>d_k \geq 0,n−k=d1​+d2​+⋯+dk​,d1​>d2​>⋯>dk​≥0,  由于 did_idi​ 互异,故仅能有一个部分为 000,以此为界,划分成:::n−k=d1+d2+⋯+dk−1+0,d1>d2>⋯>dk≥0,n−k=g1+g2+⋯+gk,g1>g2>⋯>gk≥1,n - k = d_1 +d_2 + \cdots +d_{k-1} + 0,\quad d_1 > d_2 >\cdots>d_k \geq 0,\\n - k = g_1 +g_2 + \cdots +g_k,\quad g_1 > g_2 >\cdots>g_k \geq 1,n−k=d1​+d2​+⋯+dk−1​+0,d1​>d2​>⋯>dk​≥0,n−k=g1​+g2​+⋯+gk​,g1​>g2​>⋯>gk​≥1,  两部分,显然有递推式:::pdkn=pdk−1(n−k)+pdk(n−k).pd_kn=pd_{k-1}(n-k) + pd_k(n-k).pdk​n=pdk−1​(n−k)+pdk​(n−k).

#include <stdio.h>const int N = 2022, k = 10;long long pd[N + 1][k + 1]{1};int main() {for (int i = 1; i <= N; ++i)for (int j = 1; j <= k; ++j)if (i >= j) pd[i][j] = pd[i - j][j] + pd[i - j][j - 1];printf("%lld", pd[N][k]);
}

  上来就这么劲爆的吗,难度


试题 B: 钟表

本题总分:555 分


【问题描述】

  在 121212 小时制的钟表中,有分针、时针、秒针来表示时间。记分针和时针之间的夹角度数为 A(0≤A≤180)A(0 ≤ A ≤ 180)A(0≤A≤180)、分针和秒针之间的夹角度数为 B(0≤B≤180)B(0 ≤ B ≤ 180)B(0≤B≤180)。而恰好在 sss 时 fff 分 mmm 秒时,满足条件 A=2BA = 2BA=2B 且 0≤s≤6;0≤f<60;0≤m<600 ≤ s ≤ 6;0≤ f < 60;0≤m < 600≤s≤6;0≤f<60;0≤m<60,请问 s,f,ms, f,ms,f,m 分别是多少。

  注意时针、分针、秒针都围绕中心匀速转动。

  提交格式为三个由一个空格隔开的整数,分别表示 s,f,ms, f,ms,f,m。如 311583\ 11\ 583 11 58 表示 333 点 111111 分 585858 秒。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为三个由一个空格隔开的整数,在提交答案时只填写为三个由一个空格隔开的整数,填写多余的内容将无法得分。


4 48 0


  为了一定程度上的运算简便,这里周角为 606060 度,

  然后 BF\small \rm BFBF 就完了。

#include <stdio.h>double fabs(double x) { return x > 0 ? x : -x; }double abs(double angle) {angle = fabs(angle);if (angle > 30) return 60 - angle;return angle;
}int main() {for (int s = 0; s <= 6; ++s)for (int f = 0; f < 60; ++f)for (int m = 0; m < 60; ++m) {double second = m;double minute = f + second / 60;double hour = (s * 60 + minute) / 12;double B = abs(minute - second);double A = abs(minute - hour);if (fabs(A - 2 * B) < 1e-10)printf("%d %d %d\n", s, f, m);}
}

  还好我的好 bro\small\rm brobro 告诉我 0000\ 0\ 00 0 0 是作废答案,

  不然我就直接填了。

  其实也可以类似程序中计算角度的过程来列出三元方程组,算的还快一点。


试题 C: 卡牌

时间限制: 1.0s1.0\mathrm s1.0s 内存限制: 256.0MB256.0\mathrm{MB}256.0MB 本题总分:101010 分


【问题描述】

  这天,小明在整理他的卡牌。

  他一共有 nnn 种卡牌,第 iii 种卡牌上印有正整数数 i(i∈[1,n])i(i \in [1, n])i(i∈[1,n]),且第 iii 种卡牌现有 aia_iai​ 张。

  而如果有 nnn 张卡牌,其中每种卡牌各一张,那么这 nnn 张卡牌可以被称为一套牌。小明为了凑出尽可能多套牌,拿出了 mmm 张空白牌,他可以在上面写上数i,将其当做第 iii 种牌来凑出套牌。然而小明觉得手写的牌不太美观,决定第 iii 种牌最多手写 bib_ibi​ 张。

  请问小明最多能凑出多少套牌?

【输入格式】

  输入共 333 行,第一行为两个正整数 n,mn, mn,m。

  第二行为 nnn 个正整数 a1,a2,⋯,ana_1, a_2, \cdots, a_na1​,a2​,⋯,an​。

  第三行为 nnn 个正整数 b1,b2,⋯,bnb_1, b_2, \cdots, b_nb1​,b2​,⋯,bn​。

【输出格式】

  一行,一个整数表示答案。

【样例输入】

4 5
1 2 3 4
5 5 5 5

【样例输出】

3

【样例说明】

  这 555 张空白牌中,拿 222 张写 111,拿 111 张写 222,这样每种牌的牌数就变为了 3,3,3,43, 3, 3, 43,3,3,4,可以凑出 333 套牌,剩下 222 张空白牌不能再帮助小明凑出一套。

【评测用例规模与约定】

  对于 30%30\%30% 的数据,保证 n≤2000n ≤ 2000n≤2000;
  对于 100%100\%100% 的数据,保证 n≤2×105;ai,bi≤n;m≤n2n ≤ 2 × 10^5; a_i, b_i ≤ n; m ≤ n^2n≤2×105;ai​,bi​≤n;m≤n2 。


#include <stdio.h>const int N = 2 * 1e5;int n, A[N], B[N];long long m;int main() {scanf("%d %lld", &n, &m);for (int i = 0; i < n; ++i) scanf("%d", A + i);for (int i = 0; i < n; ++i) scanf("%d", B + i);int l = 0, r = 2 * n;while (l < r) {int flag = 1, mid = l + r + 1 >> 1;long long buf = m;for (int i = 0; i < n; ++i) {if (A[i] >= mid) continue;if (A[i] + B[i] < mid || mid - A[i] > buf) {flag = 0;break;}buf -= mid - A[i];}if (flag) l = mid; else r = mid - 1;}printf("%d", l);
}

  二分判定答案的模板。


试题 D: 最大数字

时间限制: 1.0s1.0\mathrm s1.0s 内存限制: 256.0MB256.0\mathrm{MB}256.0MB 本题总分:101010 分


【问题描述】

  给定一个正整数 NNN。你可以对 NNN 的任意一位数字执行任意次以下 222 种操作:::

  1.1.1. 将该位数字加 111。如果该位数字已经是 999,加 111 之后变成 000。
  2.2.2. 将该位数字减 111。如果该位数字已经是 000,减 111 之后变成 999。

  你现在总共可以执行 111 号操作不超过 AAA 次,222 号操作不超过 BBB 次。

  请问你最大可以将 NNN 变成多少?

【输入格式】

  第一行包含 333 个整数:::N,A,BN, A, BN,A,B。

【输出格式】

  一个整数代表答案。

【样例输入】

123 1 2

【样例输出】

933

【样例说明】

  对百位数字执行 222 次 222 号操作,对十位数字执行 111 次 111 号操作。

【评测用例规模与约定】

  对于 30%30\%30% 的数据,1≤N≤100;0≤A,B≤101 ≤ N ≤ 100; 0 ≤ A, B ≤ 101≤N≤100;0≤A,B≤10
  对于 100%100\%100% 的数据,1≤N≤1017;0≤A,B≤1001 ≤ N ≤ 10^{17}; 0 ≤ A, B ≤ 1001≤N≤1017;0≤A,B≤100


#include <stdio.h>char N[20];long long ans = 0;int A, B;inline int min(int a, int b) { return a < b ? a : b; }void dfs(int i, long long val) {if (N[i]) {int a = min(A, '9' - N[i]);A -= a;dfs(i + 1, val * 10 + N[i] + a - '0');A += a;if (N[i] - '0' < B) {int b = N[i] - '0' + 1;B -= b;dfs(i + 1, val * 10 + 9);B += b;}} else if (val > ans) ans = val;
}int main() { scanf("%s %d %d", N, &A, &B), dfs(0, 0), printf("%lld", ans); }

  看一眼数据范围就知道,贪心暴搜。


试题 E: 出差

时间限制: 1.0s1.0\mathrm s1.0s 内存限制: 256.0MB256.0\mathrm{MB}256.0MB 本题总分:151515 分


【问题描述】

  A\rm AA 国有 NNN 个城市,编号为 1⋯N\rm 1 \cdots N1⋯N。小明是编号为 111 的城市中一家公司的员工,今天突然接到了上级通知需要去编号为 N\rm NN 的城市出差。

  由于疫情原因,很多直达的交通方式暂时关闭,小明无法乘坐飞机直接从城市 111 到达城市 N\rm NN,需要通过其他城市进行陆路交通中转。小明通过交通信息网,查询到了 MMM 条城市之间仍然还开通的路线信息以及每一条路线需要花费的时间。

  同样由于疫情原因,小明到达一个城市后需要隔离观察一段时间才能离开该城市前往其他城市。通过网络,小明也查询到了各个城市的隔离信息。(由于小明之前在城市 111,因此可以直接离开城市 111,不需要隔离)

  由于上级要求,小明希望能够尽快赶到城市 N\rm NN,因此他求助于你,希望你能帮他规划一条路线,能够在最短时间内到达城市 N\rm NN。

【输入格式】

  第 111 行:::两个正整数 N,MN, MN,M,NNN 表示 A\rm AA 国的城市数量,MMM 表示未关闭的路线数量

  第 222 行:::NNN 个正整数,第 iii 个整数 CiC_iCi​ 表示到达编号为 iii 的城市后需要隔离的时间

  第 3⋯M+23 \cdots M + 23⋯M+2 行:::每行 333 个正整数,u,v,cu, v, cu,v,c,表示有一条城市 uuu 到城市 vvv 的双向路线仍然开通着,通过该路线的时间为 ccc

【输出格式】

  第 111 行:::111 个正整数,表示小明从城市 111 出发到达城市 N\rm NN 的最短时间(到达城市 N\rm NN,不需要计算城市 N\rm NN 的隔离时间)

【样例输入】

4 4
5 7 3 4
1 2 4
1 3 5
2 4 3
3 4 5

【样例输出】

13

【样例说明】

  [1(5)]−−4−−[2(7)][1(5)] --4-- [2(7)][1(5)]−−4−−[2(7)]
   ∣∣|\qquad\qquad\qquad\quad|∣∣
   ∣∣|\qquad\qquad\qquad\quad|∣∣
   535\qquad\qquad\qquad\ \:\:35 3
   ∣∣|\qquad\qquad\qquad\quad|∣∣
   ∣∣|\qquad\qquad\qquad\quad|∣∣
  [3(3)]−−5−−[4(4)][3(3)] --5-- [4(4)][3(3)]−−5−−[4(4)]

  路线 111:::1−>2−>41 -> 2 -> 41−>2−>4,时间为 4+74+74+7(隔离)+3=14+3=14+3=14
  路线 222:::1−>3−>41 -> 3 -> 41−>3−>4,时间为 5+35+35+3(隔离)+5=13+5=13+5=13

【评测用例规模与约定】

  对于 100%100\%100% 的数据,1≤N≤1000,1≤M≤10000,1≤Ci≤200,1≤u,v≤N,1≤c≤10001 ≤ N ≤ 1000 , 1 ≤ M ≤ 10000, 1 ≤ C_i ≤ 200, 1 ≤ u, v ≤ N, 1 ≤ c ≤ 10001≤N≤1000,1≤M≤10000,1≤Ci​≤200,1≤u,v≤N,1≤c≤1000


#include <stdio.h>
#include <utility>
#include <queue>const int N = 1e3 + 1, M = 4 * 1e4 + 9;int linked[M], next[M], ver[M], val[M], cur = 0;inline void link(int u, int v, int k) { ++cur, next[cur] = linked[u], linked[u] = cur, ver[cur] = v, val[cur] = k; }std::priority_queue<std::pair<int, int>> q;int n, m, u, v, c, C[N], dist[N];bool visited[N];int main() {scanf("%d %d", &n, &m);for (int i = 1; i <= n; ++i)scanf("%d", C + i), dist[i] = 0x3f3f3f3f;C[1] = 0;while (m--) {scanf("%d %d %d", &u, &v, &c);link(u, v, C[u] + c);link(v, u, C[v] + c);}dist[1] = 0;q.push({0, 1});while (q.size()) {u = q.top().second, q.pop();if (visited[u]) continue;visited[u] = 1;for (cur = linked[u]; cur; cur = next[cur])if (dist[ver[cur]] > dist[u] + val[cur]) {dist[ver[cur]] = dist[u] + val[cur];q.push({-dist[ver[cur]], ver[cur]});}}printf("%d", dist[n]);
}

  模板 ×3\times 3×3。


试题 F: 费用报销

时间限制: 1.0s1.0\mathrm s1.0s 内存限制: 256.0MB256.0\mathrm{MB}256.0MB 本题总分:151515 分


【问题描述】

  小明在出差结束后返回了公司所在的城市,在填写差旅报销申请时,粗心的小明发现自己弄丢了出差过程中的票据。

  为了弥补小明的损失,公司同意小明用别的票据进行报销,但是公司财务要求小明提交的票据中任意两张的日期差不小于 KKK 天,且总金额不得超过实际差旅费用 MMM。

  比如财务要求 K=7K = 7K=7 时,若小明提交了一张 111 月 888 日的票据,小明就不能提交 111 月 222 日至 111 月 141414 日之间的其他票据,111 月 111 日及之前和 111 月 151515 日及之后的票据则可以提交。

  公司的同事们一起给小明凑了 NNN 张票据,小明现在想要请你帮他整理一下,从中选取出符合财务要求的票据,并使总金额尽可能接近 MMM。

  需要注意,由于这些票据都是同一年的,因此 121212 月底的票据不会影响到 111 月初票据的提交。这一年不是闰年。

【输入格式】

  第 111 行:::333 个整数,N,M,KN, M, KN,M,K

  第 2⋯N+12 \cdots N + 12⋯N+1 行:::每行 333 个整数 mi,di,vim_i, d_i, v_imi​,di​,vi​,第 i+1i + 1i+1 行表示第 iii 张票据时间的月份 mim_imi​ 和日期 did_idi​,viv_ivi​ 表示该票据的面值

【输出格式】

  第 111 行:::111 个整数,表示小明能够凑出的最大报销金额

【样例输入】

4 16 3
1 1 1
1 3 2
1 4 4
1 6 8

【样例输出】

10

【样例说明】

  选择 111 月 333 日和 111 月 666 日的票据

【评测用例规模与约定】

  对于 100%100\%100% 的评测用例,1≤N≤1000,1≤M≤5000,1≤K≤50,1≤mi≤12,1≤di≤31,1≤vi≤4001 ≤ N ≤ 1000, 1 ≤ M ≤ 5000, 1 ≤ K ≤ 50, 1 ≤ m_i ≤ 12, 1 ≤ d_i ≤ 31, 1 ≤ v_i ≤ 4001≤N≤1000,1≤M≤5000,1≤K≤50,1≤mi​≤12,1≤di​≤31,1≤vi​≤400
  日期保证合法。


#include <stdio.h>
#include <algorithm>
#include <utility>const int max_N = 1e3 + 1, max_M = 5 * 1e3 + 1;const int offset[]{ 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };std::pair<int, int> bill[max_N];bool dp[max_N][max_M]{1};int N, M, K, m, d, v;int main() {scanf("%d %d %d", &N, &M, &K);for (int i = 1; i <= N; ++i)scanf("%d %d %d", &m, &d, &v),bill[i] = {offset[m] + d, v};std::sort(bill + 1, bill + N + 1);for (int i = 1, k = 0; i <= N; ++i) {while (bill[i].first - bill[k + 1].first >= K) ++k;for (int j = M; j >= bill[i].second; --j)dp[i][j] = dp[i - 1][j] | dp[k][j - bill[i].second];for (int j = bill[i].second - 1; ~j; --j) dp[i][j] = dp[i - 1][j];}for (int i = M; ~i; --i)if (dp[N][i]) {printf("%d", i);return 0;}
}

  模板 ×4\times 4×4,还是 000 - 111 背包。


试题 G: 故障

时间限制: 1.0s1.0\mathrm s1.0s 内存限制: 256.0MB256.0\mathrm{MB}256.0MB 本题总分:202020 分


【问题描述】

  在软件或系统开发中,我们会遇到各种各样的故障。为了从故障现象反推故障原因,工程师们会总结一种叫做相关性矩阵的二维表格,来表示故障原因与故障现象之间的关系。比如:::

+−−−+−−−+−−−+−−−+−−−+−−−+\scriptstyle{+---+---+---+---+---+---+}+−−−+−−−+−−−+−−−+−−−+−−−+
∣∣1∣2∣3∣4∣5∣\scriptstyle\: |\quad\quad| \textstyle{\ \ \: 1\ \ \ }\scriptstyle| \textstyle{\ \ \: 2\ \ \ }\scriptstyle|\textstyle{\ \ \: 3\ \ \ }\scriptstyle|\textstyle{\ \ \: 4\ \ \ }\scriptstyle|\textstyle{\ \ \: 5\ \ \ }\scriptstyle|∣∣  1   ∣  2   ∣  3   ∣  4   ∣  5   ∣
+−−−+−−−+−−−+−−−+−−−+−−−+\scriptstyle{+---+---+---+---+---+---+}+−−−+−−−+−−−+−−−+−−−+−−−+
∣A∣∣x∣x∣x∣∣\scriptstyle\:| \textstyle{\ \: \: \small\rm A\: \: \: }\scriptstyle|\qquad\scriptstyle| \textstyle{\ \ \: \rm x\: \ \ }\scriptstyle|\textstyle{\ \ \: \rm x\: \ \ }\scriptstyle|\textstyle{\ \ \: \rm x\: \ \ }\scriptstyle|\qquad\scriptstyle|∣ A∣∣  x  ∣  x  ∣  x  ∣∣
+−−−+−−−+−−−+−−−+−−−+−−−+\scriptstyle{+---+---+---+---+---+---+}+−−−+−−−+−−−+−−−+−−−+−−−+
∣B∣x∣∣x∣∣∣\scriptstyle\:|\textstyle{\ \: \: \small\rm B\: \: \: }\scriptstyle|\textstyle{\ \ \ \rm x \: \ \ }\scriptstyle|\qquad|\textstyle{\ \ \: \rm x\:\ \ }\scriptstyle|\qquad|\qquad|∣ B∣   x  ∣∣  x  ∣∣∣
+−−−+−−−+−−−+−−−+−−−+−−−+\scriptstyle{+---+---+---+---+---+---+}+−−−+−−−+−−−+−−−+−−−+−−−+
∣C∣∣∣∣x∣x∣\scriptstyle\:|\textstyle{\ \: \: \small \rm C\: \: \: }\scriptstyle|\qquad|\qquad|\qquad\scriptstyle|\textstyle{\ \ \: \rm x \: \ \ }\scriptstyle|\textstyle{\ \ \:\rm x \ \ \ }\scriptstyle|∣ C∣∣∣∣  x  ∣  x   ∣
+−−−+−−−+−−−+−−−+−−−+−−−+\scriptstyle{+---+---+---+---+---+---+}+−−−+−−−+−−−+−−−+−−−+−−−+

  其中每行表示一种故障原因,每一列表示一种故障现象。该矩阵表示故障原因 AAA 可能产生故障现象 2、3、42、3、42、3、4,故障原因 BBB 可能产生故障现象 1、31、31、3。

  在实际开发过程中,如果出现了故障原因,工程师就可以根据故障现象,去计算每种故障原因产生的概率,并按照概率大小对故障原因进行排查,以达到快速定位故障原因的目的。

  现在,我们假设系统开发中同一时间只会出现一种故障原因,并且故障原因引起各故障现象是独立事件。举个例子来说:::

  假设系统现在发生了故障原因 AAA,有 13\frac 1331​ 的概率出现故障现象 222,有 14\frac 1441​ 的概率出现故障现象 333,有 12\frac 1221​ 的概率出现故障现象 444。由于 333 种现象是独立发生的,因此有 12×3×4\frac 1{2\times3\times4}2×3×41​ 的概率同时出现故障 2、3、42、3、42、3、4。

  约定若相关性矩阵中没有 ‘x’\rm ‘x’‘x’ 记号,则表示该故障原因一定不会产生某故障现象,比如故障原因 AAA,一定不会产生故障现象 111。

  根据历史经验数据,我们统计得到了每一种故障原因出现的概率以及每一种故障原因对应的故障现象产生概率。

  现在已知系统出现的故障现象,求问各个故障原因发生的概率。

【输入格式】

  第 111 行:::222 个正整数 N,MN, MN,M,NNN 表示故障原因的个数(编号 1⋯N1 \cdots N1⋯N),MMM 表示故障现象的个数(编号 1⋯M1 \cdots M1⋯M)

  第 222 行:::NNN 个整数,第 iii 个数表示故障原因 iii 产生的概率 PiP_iPi​.

  第 3⋯N+23 \cdots N + 23⋯N+2 行:::每行 M+1M + 1M+1 个整数,第 i+1i + 1i+1 行第 jjj 个整数 PijP_{i j}Pij​ 表示故障原因 iii 出现故障现象 jjj 的概率(百分比)...

  第 N+3N + 3N+3 行:::111 个正整数 KKK,表示目前出现的故障现象数量

  第 N+4N + 4N+4 行:::KKK 个正整数,依次为当前出现的故障现象编号,不会重复

【输出格式】

  第 1⋯N1 \cdots N1⋯N 行:::按概率从高到低输出每种故障原因及其可能的概率,若出现概率相同则优先输出编号小的故障原因。第 111 个数为故障原因编号,第 222 个数为故障概率(百分比),保留 222 位小数。

【样例输入】

3 5
30 20 50
0 50 33 25 0
30 0 35 0 0
0 0 0 25 60
1
3

【样例输出】

2 56.89
1 43.11
3 0.00

【评测用例规模与约定】

  对于所有测试用例,1≤N≤40,1≤M≤20,0≤Pi≤100,Σ(Pi)=100,0≤Pij≤1001 ≤ N ≤ 40, 1 ≤ M ≤ 20, 0 ≤ P_i ≤ 100,\Sigma(P_i) = 100,0 ≤ P_{i j} ≤ 1001≤N≤40,1≤M≤20,0≤Pi​≤100,Σ(Pi​)=100,0≤Pij​≤100


贝叶斯定理


#include <stdio.h>
#include <algorithm>
#include <math.h>int n, m, k, P[40][21];struct node {double p;int i;inline bool operator<(const node &nd) const {return p == nd.p ? i < nd.i : p > nd.p;}
} ans[40];int main() {scanf("%d %d", &n, &m);for (int i = 0; i < n; ++i)scanf("%d", P[i]), ans[i].i = i + 1;for (int i = 0; i < n; ++i)for (int j = 1; j <= m; ++j)scanf("%d", &P[i][j]), P[i][j] = 100 - P[i][j];scanf("%d", &k);for (int g = 0, j; g < k; ++g) {scanf("%d", &j);for (int i = 0; i < n; ++i)P[i][j] = 100 - P[i][j];}double tmp = 0;for (int i = 0; i < n; ++i) {ans[i].p = *P[i] / 100.0;for (int j = 1; j <= m; ++j)ans[i].p *= P[i][j] / 100.0;tmp += ans[i].p;}std::sort(ans, ans + n);for (int i = 0; i < n; ++i)printf("%d %.2lf\n", ans[i].i, !tmp ? 0.0 : 100 * ans[i].p / tmp);
}

  全概率公式与贝叶斯公式裸题,注意判一下 P(B)P(B)P(B) 为 000 的情况就行了。

  模板 ×5\times 5×5。


试题 H: 机房

时间限制: 1.0s1.0\mathrm s1.0s 内存限制: 256.0MB256.0\mathrm{MB}256.0MB 本题总分:202020 分


【问题描述】

  这天,小明在机房学习。

  他发现机房里一共有 nnn 台电脑,编号为 111 到 nnn,电脑和电脑之间有网线连接,一共有 n−1n−1n−1 根网线将 nnn 台电脑连接起来使得任意两台电脑都直接或者间接地相连。

  小明发现每台电脑转发、发送或者接受信息需要的时间取决于这台电脑和多少台电脑直接相连, 而信息在网线中的传播时间可以忽略。比如如果某台电脑用网线直接连接了另外 ddd 台电脑,那么任何经过这台电脑的信息都会延迟 ddd 单位时间 (发送方和接收方也会产生这样的延迟,当然如果发送方和接收方都是同一台电脑就只会产生一次延迟)。

  小明一共产生了 mmm 个疑问:::如果电脑 uiu_iui​ 向电脑 viv_ivi​ 发送信息,那么信息从 uiu_iui​ 传到 viv_ivi​ 的最短时间是多少?

【输入格式】

  输入共 n+mn + mn+m 行,第一行为两个正整数 n,mn,mn,m。

  后面 n−1n−1n−1 行,每行两个正整数 x,yx,yx,y 表示编号为 xxx 和 yyy 的两台电脑用网线直接相连。

  后面 mmm 行,每行两个正整数 ui,viu_i,v_iui​,vi​ 表示小明的第 iii 个疑问。

【输出格式】

  输出共 mmm 行,第 iii 行一个正整数表示小明第 iii 个疑问的答案。

【样例输入】

4 3
1 2
1 3
2 4
2 3
3 4
3 3

【样例输出】

5
6
1

【样例说明】

  这四台电脑各自的延迟分别为 2,2,1,12,2,1,12,2,1,1。
  对于第一个询问,从 222 到 333 需要经过 2,1,32,1,32,1,3,所以时间和为 2+2+1=52 + 2 + 1 = 52+2+1=5。
  对于第二个询问,从 333 到 444 需要经过 3,1,2,43,1,2,43,1,2,4,所以时间和为 1+2+2+1=61+2+2+1 =61+2+2+1=6。
  对于第三个询问,从 333 到 333 只会产生一次延迟,所以时间为 111。

【评测用例规模与约定】

  对于 30%30\%30% 的数据,保证 n,m≤1000n,m≤1000n,m≤1000;
  对于 100%100\%100% 的数据,保证 n,m≤100000n,m≤100000n,m≤100000。


Tarjan


#include <stdio.h>const int N = 100009;int linked[N], query[N], ans[N];int next[N << 2], ver[N << 2], idx[N << 2], cur = 0;int n, m, x, y, fa[N], val[N], parent[N];bool visited[N];int find(int rt) { return parent[rt] == rt ? rt : (parent[rt] = find(parent[rt])); }void tarjan(int u) {val[u] += val[fa[u]];visited[u] = 1;parent[u] = u;for (int i = linked[u]; i; i = next[i])if (!visited[ver[i]])fa[ver[i]] = u, tarjan(ver[i]), parent[ver[i]] = u;for (int i = query[u]; i; i = next[i])if (visited[ver[i]])ans[idx[i]] = val[u] + val[ver[i]] - val[find(ver[i])] - val[fa[find(ver[i])]];
}int main() {scanf("%d %d", &n, &m);for (int i = 1; i < n; ++i) {scanf("%d %d", &x, &y);++cur, ++val[x], next[cur] = linked[x], linked[x] = cur, ver[cur] = y;++cur, ++val[y], next[cur] = linked[y], linked[y] = cur, ver[cur] = x;}for (int i = 0; i < m; ++i) {scanf("%d %d", &x, &y);++cur, idx[cur] = i, next[cur] = query[x], query[x] = cur, ver[cur] = y;++cur, idx[cur] = i, next[cur] = query[y], query[y] = cur, ver[cur] = x;}tarjan(1);for (int i = 0; i < m; ++i) printf("%d\n", ans[i]);
}

  LCA\rm LCALCA 裸题,模板 ×6\times 6×6。


试题  I: 齿轮

时间限制: 1.0s1.0\mathrm s1.0s 内存限制: 256.0MB256.0\mathrm{MB}256.0MB 本题总分:252525 分


【问题描述】

  这天,小明在组装齿轮。

  他一共有 nnn 个齿轮,第 iii 个齿轮的半径为 rir_iri​,他需要把这 nnn 个齿轮按一定顺序从左到右组装起来,这样最左边的齿轮转起来之后,可以传递到最右边的齿轮,并且这些齿轮能够起到提升或者降低转速 (角速度) 的作用。

  小明看着这些齿轮,突然有 QQQ 个疑问:能否按一定顺序组装这些齿轮使得最右边的齿轮的转速是最左边的齿轮的 qiq_iqi​ 倍?

【输入格式】

  输入共 Q+2Q + 2Q+2 行,第一行为两个正整数 n,Qn, Qn,Q,表示齿轮数量和询问数量。

  第二行为 nnn 个正整数 r1,r2,...,rnr_1,r_2, ...,r_nr1​,r2​,...,rn​,表示每个齿轮的半径。

  后面 QQQ 行,每行一个正整数 qiq_iqi​ 表示询问。

【输出格式】

  QQQ 行,对于每个询问,如果存在至少一种组装方案满足条件,输出 ‘YES‘\rm ‘YES‘‘YES‘,否则输出 ‘NO‘\rm ‘NO‘‘NO‘。

【样例输入】

5 3
4 2 3 3 1
2
4
6

【样例输出】

YES
YES
NO

【样例说明】

  询问 111 方案之一:::233412\ 3\ 3\ 4\ 12 3 3 4 1
  询问 222 方案之一:::423314\ 2\ 3\ 3\ 14 2 3 3 1
  询问 333 没有方案

【评测用例规模与约定】

  对于 15%15\%15% 的数据,保证 n,Q≤100n, Q ≤ 100n,Q≤100;
  对于 30%30\%30% 的数据,保证 n,Q≤2000n, Q ≤ 2000n,Q≤2000;
  对于 100%100\%100% 的数据,保证 n,Q≤2×105;ai,qi≤2×105n, Q ≤ 2 × 10^5; a_i, q_i ≤ 2 × 10^5n,Q≤2×105;ai​,qi​≤2×105。


  容易发现 nnn 个齿轮按一定顺序组装起来,最左齿轮与最右齿轮之间,转速的关系与这一序列齿轮中间 2∼n−12 \sim n-12∼n−1 个无关。

  于是问题就被转变为,对于每一个 qqq,是否存在一对 i,ji,ji,j,满足 ri=qrjr_i = qr_jri​=qrj​,看一眼数据范围,直接倍数法离线求解了。

#include <stdio.h>const int N = 200000;bool g[N + 1], q[N + 1];int n, r, Q;int main() {scanf("%d %d", &n, &Q);for (int i = 0; i < n; ++i) {scanf("%d", &r);if (g[r]) q[1] = 1;g[r] = 1;}for (int i = 1; i <= N; ++i)if (g[i])for (int j = 2; i * j <= N; ++j)if (g[i * j]) q[j] = 1;for (int i = 0; i < Q; ++i)scanf("%d", &r), puts(q[r] ? "YES" : "NO");
}

试题 J: 搬砖

时间限制: 1.0s1.0\mathrm s1.0s 内存限制: 256.0MB256.0\mathrm{MB}256.0MB 本题总分:252525 分


【问题描述】

  这天,小明在搬砖。

  他一共有 nnn 块砖,他发现第 iii 砖的重量为 wiw_iwi​,价值为 viv_ivi​。他突然想从这些砖中选一些出来从下到上堆成一座塔,并且对于塔中的每一块砖来说,它上面所有砖的重量和不能超过它自身的价值。

  他想知道这样堆成的塔的总价值(即塔中所有砖块的价值和)最大是多少。

【输入格式】

  输入共 n+1n + 1n+1 行,第一行为一个正整数 nnn,表示砖块的数量。

  后面 nnn 行,每行两个正整数 wi,viw_i, v_iwi​,vi​ 分别表示每块砖的重量和价值。

【输出格式】

  一行,一个整数表示答案。

【样例输入】

5
4 4
1 1
5 2
5 5
4 3

【样例输出】

10

【样例说明】

  选择第 1、2、41、2、41、2、4 块砖,从上到下按照 2、1、42、1、42、1、4 的顺序堆成一座塔,总价值为 4+1+5=104 + 1 + 5 = 104+1+5=10

【评测用例规模与约定】

  对于 20%20\%20% 的数据,保证 n≤10n ≤ 10n≤10;
  对于 100%100\%100% 的数据,保证 n≤1000;wi≤20;vi≤20000n ≤ 1000; w_i ≤ 20; v_i ≤ 20000n≤1000;wi​≤20;vi​≤20000。


背包 DP


#include <stdio.h>
#include <algorithm>
#include <utility>inline int max(int a, int b) { return a > b ? a : b; }std::pair<int, int> brick[20000];int n, dp[200001];int main() {scanf("%d", &n);for (int i = 0; i < n; ++i)scanf("%d %d", &brick[i].second, &brick[i].first);std::sort(brick, brick + n);for (int i = 0; i < n; ++i)for (int j = brick[i].first; j >= 0; --j)if (dp[j] || !j) dp[j + brick[i].second] = max(dp[j + brick[i].second], dp[j] + brick[i].first);for (int i = brick[n - 1].first + brick[n - 1].second; i >= 0; --i)if (dp[i]) {printf("%d", dp[i]);return 0;}
}

第十三届蓝桥杯大赛软件赛决赛(C/C++ 大学B组)相关推荐

  1. 第十三届蓝桥杯大赛软件赛决赛(Java 大学C组)

    蓝桥杯 2022年国赛真题 Java 大学C组 试题 A: 斐波那契与 7 试题 B: 小蓝做实验 试题 C: 取模 试题 D: 内存空间 试题 E: 斐波那契数组 试题 F: 最大公约数 试题 G: ...

  2. 第十三届蓝桥杯大赛软件赛决赛(Java 大学B组)

    蓝桥杯 2022年国赛真题 Java 大学B组  试题 A: 重合次数  试题 B: 数数  试题 C: 左移右移  试题 D: 窗口  试题 E: 迷宫  试题 F: 小球称重  试题 G: 背包与 ...

  3. 第十三届蓝桥杯大赛软件赛决赛(Java 大学A组)

    蓝桥杯 2022年国赛真题 Java 大学A组 试题 A: 火柴棒数字 试题 B: 小蓝与钥匙 试题 C: 内存空间 试题 D: 斐波那契数组 试题 E: 交通信号 试题 F: 数组个数 试题 G: ...

  4. 2022年第十三届蓝桥杯大赛软件类决赛C/C++大学B组(国赛)题解

    2022国赛B组 题目一:C题 卡牌 题目二:D题 最大数字 题目三:E题 出差 题目四:F题 费用报销 题目五:G题 故障 题目六:H题 机房 题目七:I题 齿轮 题目八:J题 搬砖 刷题链接: h ...

  5. 2022年第十三届蓝桥杯大赛软件类决赛C/C++大学B组C题卡牌

    题意: 有n种牌,第i种牌有ai 张,一套牌为n张牌每种各一张,为凑出更多的牌,用m张空白牌写上种类,每种最多写bi张,求最多能凑几幅牌. 思考: 已知ai.bi,不考虑有多少张空白牌,最多能凑min ...

  6. 2022年第十三届蓝桥杯大赛软件类决赛C/C++大学B组E题出差

    题意: 有N个城市,编号1...N,无法从1出发到N,需要通过其他城市中转,并且到达后需隔离,求1到N时间最短的路线. 思路: 最短路变形,求时间最短,使用Dijkstra算法松弛时需加上隔离的时间, ...

  7. 第十三届蓝桥杯大赛软件赛决赛C组C++

    试题 A: 斐波那契与 7 本题总分:5 分 [问题描述] 斐波那契数列的递推公式为:Fn = Fn−1 + Fn−2,其中 F1 = F2 = 1. 请问,斐波那契数列的第 1 至 20220201 ...

  8. 2021年第十二届蓝桥杯大赛软件赛决赛C/C++大学A组 个人部分题解

    题目下载链接:https://download.csdn.net/download/ljw_study_in_CSDN/19403461 这次国赛,基本上大题都是暴力写的,填空题只写了前两个,老混子选 ...

  9. 2022年第十三届蓝桥杯大赛软件类决赛C/C++/Java/Python真题

    1.2022年第十三届蓝桥杯大赛软件类决赛C/C++大学A组真题 2022年第十三届蓝桥杯大赛软件类决赛C/C++大学A组真题 - 题库 - C语言网 2. 2022年第十三届蓝桥杯大赛软件类决赛C/ ...

最新文章

  1. linux获取url中文内容_Chrome OS 似乎将在Linux 的方向上更进一步
  2. JavaScript对象的创建之动态原型方式
  3. 多边形之间相交求交点的算法_路径规划算法总结
  4. @Transactional和@Async 使用场景
  5. [BZOJ 5072]小A的树
  6. script和scriptreplay命令实现终端录制和回放。
  7. Jmeter(四十八)_动态线程分析HTML测试报告
  8. char 类型的取值范围
  9. 木马 --- 基本概念和分类
  10. 第六届北大CIO班结业暨SOA与BPM论坛成功举办
  11. __wakeup绕过版本_PHP__wakeup()方法
  12. 丽台显卡测试软件,领先A卡62% 丽台7系显卡对比测试
  13. 上周热点回顾(11.18-11.24)
  14. c语言can收发数据原理,汽车车载网络CAN收发器作用和工作原理
  15. visual studio 2010 没有代码提示(智能提示)或代码提示很慢解决方案一例
  16. 如何在ESXi中启用巨型帧支持?
  17. 编程番外篇:Rider体验与常用功能分享
  18. 数据库、mysql和sql的入门简明教程
  19. 最好用的地图匹配框架——基于HMM的Valhalla
  20. lodash 之 Chain

热门文章

  1. Maya 交互式播放
  2. C++ 异常处理机制的实现
  3. 女人需要调教人需要调教
  4. 单基因gsea_零代码5分+的单基因综合分析
  5. 《Wireshark数据包分析实战》读书笔记
  6. VM 虚拟机屏幕大小的调整
  7. 无法连接虚拟设备 ide1:0,因为主机上没有相应的设备。 您要在每次开启此虚拟机时都尝试连接此虚拟设备吗?
  8. Spring Boot中多个PostConstruct注解执行顺序控制
  9. python画一片树叶的故事_《Python数据分析与机器学习实战-唐宇迪》读书笔记第7章--决策树...
  10. android studio 编译Telegram源码