消减整数

消减整数

https://ac.nowcoder.com/acm/contest/11163/C

消减整数

题目链接:nowcoder 219038

到主站看:https://blog.csdn.net/weixin_43346722/article/details/116171958

题目大意

给你一个数,然后你可以从减 1 开始,接着每次减的要么跟上一次一样,要么是它的两倍,问你最少把减多少次才能把它减到 0。

思路

这道题我们考虑用贪心来做。

那它每次减的可以跟原来一样,也可以翻倍。
那为了让我们减的次数最小,我们肯定是能翻倍就翻倍啊。

那怎么看能不能翻倍呢?
由于你翻倍之后至少都要减它,你要刚好减到 0,就是它剩下的数是它的倍数。

那就可以了,直接贪心就可以了。

代码

#include<cstdio>
#define ll long long

using namespace std;

int T;
ll h, ans, two;

int main() {
    scanf("%d", &T);
    while (T--) {
        ans = 0;
        two = 1;

        scanf("%lld", &h);
        while (h) {
            h -= two;//减
            ans++;//统计次数
            if (h % (2 * two) == 0) two *= 2;//能减两倍的就减两倍
        }

        printf("%d\n", ans);
    }

    return 0;
}
全部评论

相关推荐

昨天 23:00
武汉大学 Java
点赞 评论 收藏
分享
2025-12-13 14:51
已编辑
井冈山大学 算法工程师
龙虾x:算法比你强的没有你美,比你美的…..算了已经没有比你美的了
工作两年想退休了
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务