zoukankan      html  css  js  c++  java
  • 广工校赛 倒水(Water)

    Problem E: 倒水(Water)

    Description

    一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)

    显然在某些情况下CC无法达到目标,比如N=3,K=1。此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标。

    现在CC想知道,最少需要买多少新瓶子才能达到目标呢?

    Input

    第一行一个整数T,表示有T组数据。

    接着T行,每行两个正整数, N,K(1<=N<=10^9K<=1000)

    Output

    一个非负整数,表示最少需要买多少新瓶子。

    Sample Input

    3
    3 1
    13 2
    1000000 5

    Sample Output

    1
    3
    15808
     
    分析:两个含水量相同的瓶子倾倒,变成了1个瓶子,这符合二进制的特性,所以把问题向二进制方面,转化。
     
    将瓶子的数量转化为二进制数之后,二进制数中的1的个数,就代表最后必然会留下的最少的瓶子数目
     
    如果这个数大于k,那么我们就要减少1的数目,从二进制数右边数起第一个是1的数的位置为i(最右边为0)
    那么我们加上2的i次方就可能减少1的数目,得到新的二进制数,然后再将新的二进制数重复这个过程 直到符合要求
    为止,2的i次方采用了快速幂的方式。
    群里的前辈说 不要依耐pow.  强制转化类型会影响精度,所以我准备尽量少用
    #include <cstdio>
    #include <iostream>
    #include <cmath>
    using namespace std;
    #define INF 0x7fffffff
    int main()
    {
        int n,k,h,r,t,f,tim,x,ans,a,num;
        cin>>t;
        while(t--)
        {
          cin>>n>>k;
              for(int i=n;;i=i+ans)
              {
                  num=0;
                    h=i;
                    f=-1;
                    tim=0;
                     while(h>0)
            {
                if(h%2==1)
                {
                    if(f==-1)
                    f=tim;
                    num++;
                }
               h=h/2;
               tim++;
            }
             ans=1;
            a=2;
            while(f>0)
            {
                if(f%2==1)ans=ans*a;
                f=f/2;
                a=a*a;
            }
                  if(num<=k)
                  {
                      r=i-n;
                      break;
                  }
                  f++;
              }
              cout<<r<<endl;
          }
    
        return 0;
    }
  • 相关阅读:
    【0711作业】使用封装实现企鹅
    【0711作业】模拟选民投票
    【0709作业】判断三个数是否能组成三角形以及组成的三角形类型
    【0709作业】简易的购房商贷月供计算器
    【0708】(OOP)用户密码管理
    数据库基础
    转行小白成长路-java篇
    转行小白成长路-java篇
    转行小白成长路-java篇
    转行小白成长路-java篇
  • 原文地址:https://www.cnblogs.com/a249189046/p/6637516.html
Copyright © 2011-2022 走看看