• CSU 1530


    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=94468#problem/E

    题意:n的意思是一共有2的n次方重量的金子,要使恰好a+b=重量,每次只能把金子炸开一半。

    思路:只需要找到a和b中 最小的 2的次方 因子。

    AC代码:

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int T,k1,k2;
        long long n,a,b;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%lld%lld%lld",&n,&a,&b);//注意 long long 
            int k=min(a,b);
            if(k==1)
            {
                printf("%d
    ",n);
            }
            else
            {
                long long ans=1;
                for(int i=1; i<=n; i++)
                {
                    ans*=2;
                }
                long long a1=ans;
                for(int i=n; i>=0; i--)
                {
                    if(a>=ans)
                    {
                        a-=ans;
                    }
                    if(a==0)
                    {
                        k1=i;
                        break;
                    }
                    ans/=2;
                }
                for(int i=n; i>=0; i--)//一定到0,因为有可能会出现1
                {
                    if(b>=a1)
                    {
                        b-=a1;
                    }
                    if(b==0)
                    {
                        k2=i;
                        break;
                    }
                    a1/=2;
                }
                if(k1>k2)//看a,b哪个里面的因子最小,输出次方数
                {
                    printf("%d
    ",n-k2);
                }
                else
                {
                    printf("%d
    ",n-k1);
                }
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    android测试点汇总
    Java Web应用调优线程池
    大型网站架构技术一览
    如何用消息系统避免分布式事务
    VMware Tools安装
    Git
    构架分布式队列编程
    排序算法概述
    ThreadLocal使用和原理
    JVM常用参数配置
  • 原文地址:https://www.cnblogs.com/qioalu/p/4869449.html
Copyright © 2020-2023  润新知