zoukankan      html  css  js  c++  java
  • 倒水

    倒水(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

    33 113 21000000 5

    Sample Output

    1315808

    HINT


    这是一个二叉树的题,因为新瓶子中的水都是1升,两个含水量相同的瓶子可以兑到一起,就是用二叉树将水分到二叉树上的各个节点,当加入一个新瓶子的时候更新节点的值,求出最少需要多少个瓶子



    code:

    #include<math.h>
    #include<stdio.h>
    #include<string.h>

    int vis[50];
    int main ()
    {
        int n,m,t;
        scanf("%d",&t);
        vis[0]=0;
        while(t--)
        {
            scanf("%d %d",&n,&m);
            int i=1;
            while(n>=1)
            {
                vis[i]=(int)log2(n);
                vis[i]=pow(2,vis[i]);
    //            printf("%d ",vis[i]);
                n-=vis[i++];
            }
    //        printf(" ------ ");
            i--;
            int sum=0;
            while(i>m)
            {
                sum+=vis[i];
                vis[i]*=2;
                while(vis[i]==vis[i-1])
                {
                    vis[i-1]*=2;
                    i--;
                }
            }
            printf("%d ",sum);
        }
        return 0;
    }


  • 相关阅读:
    字符串语法
    组合数
    并查集
    Java Collection HashMap源码分析
    Java 虚拟机 ClassLoader
    Java 多线程 Future
    Java 虚拟机 GC机制
    Java 基础 原生类型
    Java 多线程 死锁deadlock产生原因+避免方法
    Java 基础 基本类型vs引用类型,传值vs传引用
  • 原文地址:https://www.cnblogs.com/szj-lxl/p/6684524.html
Copyright © 2011-2022 走看看