第十三届蓝桥杯大赛软件赛决赛(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>>rk1  的解的数量,两边同时减去 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, nk=d1+d2++dk,d1>d2>>dk0  由于 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, nk=d1+d2++dk1+0,d1>d2>>dk0nk=g1+g2++gk,g1>g2>>gk1  两部分,显然有递推式 : : 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=pdk1(nk)+pdk(nk).

#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) A0A180、分针和秒针之间的夹角度数为 B ( 0 ≤ B ≤ 180 ) B(0 ≤ B ≤ 180) B0B180。而恰好在 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 0s60f<600m<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,

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值