Thrift
一个OIer的博客
随笔 - 14,  文章 - 0,  评论 - 1,  阅读 - 62

题目链接

思路

不能形成树的情况:

  • 第一,一棵树必须有叶子节点。所以 $c=0$ 的情况就一定不能形成一棵树。
  • 其次,可以发现,我们每增加一个度为 $2$ 的节点,叶子节点就也会增加 $1$ 个。所以 $a+1 \neq c$ 的情况也肯定不行了。
  • 代码片段
    if (!c || a + 1 != c)
    cout << "-1" << endl;

接下来,我们考虑怎么计算答案。

  • 首先,我们把分支节点安排好。树的高度至少是 $\log_2 a$。
  • 接着我们可以计算出树的高度不变化的情况下还能放多少个节点,如果不够我们就继续将树扩大。
  • 代码片段
    int cnt = 0, s = 1;
    while (s < a + 1)
    {
    cnt++;
    s *= 2;
    }
    if (b > s - a - 1)
    cnt++;
    if (b > s && b > a + 1)
    cnt += (b - s + a) / (a + 1);
    cout << cnt << endl;

完整代码

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int a, b, c;
cin >> a >> b >> c;
if (!c || a + 1 != c)
cout << "-1" << endl;
else
{
int cnt = 0, s = 1;
while (s < a + 1)
{
cnt++;
s *= 2;
}
if (b > s - a - 1)
cnt++;
if (b > s && b > a + 1)
cnt += (b - s + a) / (a + 1);
cout << cnt << endl;
}
}
return 0;
}
posted on   海石竹跃  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示