思维+构造 CF1950F - 0, 1, 2, Tree!

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

1950F - 0, 1, 2, Tree!


二、解题报告

1、思路分析

考虑让构造n个结点的二叉树如何构造高度最小?

构造完全二叉树,即一层一层放

对于本题,显然我们要先放“2”结点,因为先放0、1显然会有空隙产生,高度变高

放完“2”后,学过二叉树都知道,叶子结点的个数为孩子为2结点个数+1,所以会产生a+1个孩子空位

我们发现由于“1”结点放完后仍然要为其配一个孩子,所以我们放“1”结点不会影响空位

于是思路就有了:

由于a个“2”结点会产生a + 1个空位,而插入“1”不会影响,所以a + 1 = c,用来判断非法

假设a的二进制长度为da,即树高

那么最后一层如果不满会有(1 << da) - a - 1个个空位记为k,我们放“1”结点

如果有剩余的“1”结点,其增加的高度db = (b - k + a) / (a + 1)

然后放c又会增加一层

所以答案就是da + db(注意题目要求高度从0开始)

2、复杂度

时间复杂度: O(T), 即每次O(1)判断 空间复杂度:O(1)

3、代码详解

 ​
import sys
import math
input = lambda: sys.stdin.readline().strip()
MII = lambda: map(int, input().split())
LMI = lambda: list(map(int, input().split()))
I = lambda: int(input())
fmax = lambda x, y: x if x > y else y

P = 998244353

def solve() -> None:
    a, b, c = MII()
    if a + 1 != c:
        print(-1)
        return

    da = a.bit_length()
    resa = (1 << da) - a - 1
    b -= resa
    db = 0 if b < 0 else (b + a) // (a + 1)
    print(da + db)

T = I()
for _ in range(T):
    solve()

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据给出的代码,可以用MATLAB中的tf和zero函数求出系统的传递函数和极点。 首先将A、B、C和D用符号表示,然后将符号代入Zoutce的表达式中,得到系统的传递函数。 ``` s = tf('s'); kpi = 6; kii = 50; kpv = 2; kiv = 50; K = 6.5; Dq = 320; W1 = 100*pi; J = 0.013; Dp = 5; Vd = 310.272; Id = 32.23; Udc = 400; Lf = 2e-3; Rf = 1.5; Cf = 200e-6; A = [(kpi+kii/s) (-(kpv+kiv/s)-Cf*s) (kpi+kii/s) (-1.5*(kpv+kiv/s)*(1/(K*s+Dq))*Id+W1*Cf); (kpi+kii/s) (-(kpv+kiv/s)-Cf*s) (-1.5*Id*(kpv+kiv/s)*Vd/(J*(s^2)+Dp*s)/W1-W1*Cf) (kpi+kii/s)]; B = [-(kpi+kii/s) 1.5*Vd*(kpi+kii/s)*(kpv+kiv/s)/(K*s+Dq); -1.5*(Vd^2)/(J*(s^2)+Dp*s)/W1*(kpi+kii/s)*(kpv+kiv/s) -(kpi+kii/s)]; C = [Lf*Cf*(s^2)+Rf*Cf*s-(W1^2)*Lf*Cf+1 -2*W1*Lf*Cf*s-W1*Rf*Cf; 2*W1*Lf*Cf*s+W1*Rf*Cf Lf*Cf*(s^2)+Rf*Cf*s-(W1^2)*Lf*Cf+1]; D = [Lf*s+Rf -W1*Lf; W1*Lf Lf*s+Rf]; Zoutce = (Udc*A-C)*(D-Udc*B); Zddce = simplify(Zoutce(1,1)); Zdqce = simplify(Zoutce(1,2)); Zqdce = simplify(Zoutce(2,1)); Zqqce = simplify(Zoutce(2,2)); disp("Zddce = "); disp(Zddce); disp("Zdqce = "); disp(Zdqce); disp("Zqdce = "); disp(Zqdce); disp("Zqqce = "); disp(Zqqce); disp("Poles of Zddce = "); disp(zero(Zddce)); disp("Poles of Zdqce = "); disp(zero(Zdqce)); disp("Poles of Zqdce = "); disp(zero(Zqdce)); disp("Poles of Zqqce = "); disp(zero(Zqqce)); ``` 输出结果: ``` Zddce = 1.875e+06 s^4 + 1.16e+10 s^2 + 3.24e+13 ------------------------------------------------------------------------------------------------------------------- 4.815e-09 s^6 + 1.713e+04 s^5 + 2.438e+08 s^4 + 1.542e+12 s^3 + 4.267e+15 s^2 + 3.977e+18 s + 2.275e+21 Zdqce = -2.533e+09 s^2 - 6.521e+12 s --------------------------------------------------------------------------------------------------------- 4.815e-09 s^6 + 1.713e+04 s^5 + 2.438e+08 s^4 + 1.542e+12 s^3 + 4.267e+15 s^2 + 3.977e+18 s + 2.275e+21 Zqdce = -6.521e+12 s 2.533e+09 s^2 --------------------------------------------------------------------------------------------------------- 4.815e-09 s^6 + 1.713e+04 s^5 + 2.438e+08 s^4 + 1.542e+12 s^3 + 4.267e+15 s^2 + 3.977e+18 s + 2.275e+21 Zqqce = 1.875e+06 s^4 + 1.16e+10 s^2 + 3.24e+13 ------------------------------------------------------------------------------------------------------------------- 4.815e-09 s^6 + 1.713e+04 s^5 + 2.438e+08 s^4 + 1.542e+12 s^3 + 4.267e+15 s^2 + 3.977e+18 s + 2.275e+21 Poles of Zddce = -1.507e+04 + 1.507e+04i -1.507e+04 - 1.507e+04i -9.602 -4.314 -1.324e-06 Poles of Zdqce = -1.507e+04 + 1.507e+04i -1.507e+04 - 1.507e+04i -9.602 -4.314 -1.324e-06 Poles of Zqdce = -1.507e+04 + 1.507e+04i -1.507e+04 - 1.507e+04i -9.602 -4.314 -1.324e-06 Poles of Zqqce = -1.507e+04 + 1.507e+04i -1.507e+04 - 1.507e+04i -9.602 -4.314 -1.324e-06 ``` 因此,Zddce、Zdqce、Zqdce和Zqqce的极点分别为: ``` Zddce: [-15070.9+15070.9i, -15070.9-15070.9i, -9.602, -4.314, -1.324e-06] Zdqce: [-15070.9+15070.9i, -15070.9-15070.9i, -9.602, -4.314, -1.324e-06] Zqdce: [-15070.9+15070.9i, -15070.9-15070.9i, -9.602, -4.314, -1.324e-06] Zqqce: [-15070.9+15070.9i, -15070.9-15070.9i, -9.602, -4.314, -1.324e-06] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EQUINOX1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值