zoukankan      html  css  js  c++  java
  • 洛谷 P1582 倒水

    洛谷 P1582 倒水

    题目描述

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

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

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

    输入格式

    一行两个正整数, N,K(1le Nle 2 imes 10^9,Kle 10001≤N≤2×109,K≤1000)。

    输出格式

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

    输入输出样例

    输入 #1

    3 1
    

    输出 #1

    1
    

    输入 #2

    13 2
    

    输出 #2

    3
    

    输入 #3

    1000000 5
    

    输出 #3

    15808
    

    题解:

    这个可以联想到二进制,n最少可以合成多少个瓶子就是n的二进制1的数目,要使得1的数目少于或者等于k,可以通过进位来减少1的数量。n&(-n)就是末尾1的位置,如果n=100100(2),n&(-n) = 100.

    #include <cstdio>
    
    int main() {
        long long n, k, ans = 0;
        scanf("%lld %lld", &n, &k);
        while(1) {
            int cnt = 0;
            long long nn = n;
            while(nn) {
                if(nn & 1) cnt++;
                nn >>= 1;
            }
            if(cnt <= k) break;
            ans += n & (-n);
            n += n & (-n);
        }
        printf("%lld
    ", ans);
        return 0;
    }
    
    
  • 相关阅读:
    贪婪与非贪婪模式
    Arduino语言介绍
    POJ 3249 记忆化搜索或拓扑排序
    POJ 3177 缩点 + 边双连通图
    POJ 1637 网络流构图
    hdu 1285 拓扑排序+优先队列
    POJ 3160 缩点+拓扑排序+简单dp
    POJ 3592 缩点+拓扑排序+最长路
    针对11级队员的暑假训练计划(初稿)
    POJ 2762 缩点+判断是否是最长链
  • 原文地址:https://www.cnblogs.com/fanshhh/p/11411916.html
Copyright © 2011-2022 走看看