蓝桥杯 2022年国赛真题
C/C++ 大学B组
更新中…
试题 A: 2022
本题总分: 5 5 5 分
【问题描述】
将 2022 2022 2022 拆分成 10 10 10 个互不相同的正整数之和,总共有多少种拆分方法?
注意交换顺序视为同一种方法,例如 2022 = 1000 + 1022 2022 = 1000 + 1022 2022=1000+1022 和 2022 = 1022 + 1000 2022 = 1022 + 1000 2022=1022+1000 就视为同一种方法。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个由大写字母组成的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。
379187662194355221
k 部分互异分拆数
定义 p d k n pd_kn pdkn 为 n n n 分拆成 k k k 个不同的部分的方案数,即下列方程 : : : n = r 1 + r 2 + ⋯ + r k , r 1 > r 2 > ⋯ > r k ≥ 1 n = r_1 +r_2 + \cdots +r_k,\quad r_1 > r_2 >\cdots>r_k \geq 1 n=r1+r2+⋯+rk,r1>r2>⋯>rk≥1 的解的数量,两边同时减去 k k k : : : n − k = d 1 + d 2 + ⋯ + d k , d 1 > d 2 > ⋯ > d k ≥ 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, 由于 d i d_i di 互异,故仅能有一个部分为 0 0 0,以此为界,划分成 : : : n − k = d 1 + d 2 + ⋯ + d k − 1 + 0 , d 1 > d 2 > ⋯ > d k ≥ 0 , n − k = g 1 + g 2 + ⋯ + g k , g 1 > g 2 > ⋯ > g k ≥ 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, 两部分,显然有递推式 : : : p d k n = p d k − 1 ( n − k ) + p d k ( n − k ) . pd_kn=pd_{k-1}(n-k) + pd_k(n-k). pdkn=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: 钟表
本题总分: 5 5 5 分
【问题描述】
在 12 12 12 小时制的钟表中,有分针、时针、秒针来表示时间。记分针和时针之间的夹角度数为 A ( 0 ≤ A ≤ 180 ) A(0 ≤ A ≤ 180) A(0≤A≤180)、分针和秒针之间的夹角度数为 B ( 0 ≤ B ≤ 180 ) B(0 ≤ B ≤ 180) B(0≤B≤180)。而恰好在 s s s 时 f f f 分 m m m 秒时,满足条件 A = 2 B A = 2B A=2B 且 0 ≤ s ≤ 6 ; 0 ≤ f < 60 ; 0 ≤ m < 60 0 ≤ s ≤ 6;0≤ f < 60;0≤m < 60 0≤s≤6;0≤f<60;0≤m<60,请问 s , f , m s, f,m s,f,m 分别是多少。
注意时针、分针、秒针都围绕中心匀速转动。
提交格式为三个由一个空格隔开的整数,分别表示 s , f , m s, f,m s,f,m。如 3 11 58 3\ 11\ 58 3 11 58 表示 3 3 3 点 11 11 11 分 58 58 58 秒。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为三个由一个空格隔开的整数,在提交答案时只填写为三个由一个空格隔开的整数,填写多余的内容将无法得分。
4 48 0
为了一定程度上的运算简便,这里周角为 60 60 60 度,
然后 B F \small \rm BF BF 就完了。
#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);
}
}
还好我的好 b r o \small\rm bro bro 告诉我 0 0 0 0\ 0\ 0 0 0 0 是作废答案,
不然我就直接填了。
其实也可以类似程序中计算角度的过程来列出三元方程组,算的还快一点。
试题 C: 卡牌
时间限制: 1.0 s 1.0\mathrm s 1.0s 内存限制: 256.0 M B 256.0\mathrm{MB} 256.0MB 本题总分: 10 10 10 分
【问题描述】
这天,小明在整理他的卡牌。
他一共有 n n n 种卡牌,第 i i i 种卡牌上印有正整数数 i ( i ∈ [ 1 , n ] ) i(i \in [1, n]) i(i∈[1,n]),且第 i i i 种卡牌现有 a i a_i ai 张。
而如果有 n n n 张卡牌,其中每种卡牌各一张,那么这 n n n 张卡牌可以被称为一套牌。小明为了凑出尽可能多套牌,拿出了 m m m 张空白牌,他可以在上面写上数i,将其当做第 i i i 种牌来凑出套牌。然而小明觉得手写的牌不太美观,决定第 i i i 种牌最多手写 b i b_i bi 张。
请问小明最多能凑出多少套牌?
【输入格式】
输入共 3 3 3 行,第一行为两个正整数 n , m n, m n,m。
第二行为 n n n 个正整数 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots, a_n a1,