来水一发水题。。

题目链接

正解开始:

首先,我们根据题意,可以得知这是一个有关二进制的题目;

具体什么关系,怎么做,我们来具体分析:

对于每个n,我们尝试将其二进制分解,也就是100101之类的形式

根据瓶子合并的特性,我们可以判定最后每一个瓶子内的水都可以表示成2^i的形式

感性理解:对于每一个数位上为1的地方,自然,他可以经过多次合并(瓶子加水)来合成,因为每个瓶子内的水都可以表示成2^i的形式,也就对应着n二进制分解上的一个1.

说白了就是从开始的那一堆瓶子里面进行合成,最后在不加瓶子的情况下,必定会合成为n的二进制分解的形式,其中1的个数为瓶子剩余的个数。

那么我们求n的二进制分解中有多少个1,如果1的个数比k小了,说明经过一系列令人窒息的操作后我们在不加瓶子的情况下能够最后剩余的瓶子个数。如果比k要大的话,我们考虑加瓶子:

举个例子:18  用二进制表示的话就是:1010

其中剩余两个瓶子,其中内的水量分别是16L,2L。如果我们要求k=1,也就是只剩下1个瓶子的话,那么我们贪心的考虑,自然买的瓶子量越少越好,也就是从二进制位右边开始,检测1,这时检测到了内含有2L水的瓶子,要想合并,自然要另外找新瓶子并合并成和当前瓶子容量一致的新瓶子,也就是我们还需要1个2L水的瓶子,那么自然的,我们需要两瓶新水,把2累加到答案ans上。

10010+10=10100;

10100+100=11000;

11000+1000=100000;

这时候只剩下1瓶内含有32升水的瓶子。符合k=1的要求

那么答案就是10+100+1000=1110(二进制)=14升水=14个新瓶子。

思路讲解完毕,代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int read()
{
int ans=;
char ch=getchar(),last=' ';
while(ch<''||ch>'')last=ch,ch=getchar();
while(ch>=''&&ch<='')ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return last=='-'?-ans:ans;
}
int n,k,ans;
int lowbit(int x)
{
return x&(-x);
}
int find1(int n)
{
int num=;
while(n>)
{
num+=(n&==?:);
n>>=;
}
return num;
}
int main()
{
n=read();k=read();
while(find1(n)>k)
{
ans+=lowbit(n);n+=lowbit(n);
}
printf("%d",ans);
}

完结

P1582 倒水 题解的更多相关文章

  1. 洛谷P1582 倒水题解

    题目 分析 这个题并不难,只是需要仔细思考我们首先可以很轻松的把这个题给疏通一下题意. 1:首先我们最后每个瓶子中装的水一定是一个$2^x$,因为每次都是$2$倍的加,这个应该很好理解. 2:我们要明 ...

  2. 洛谷 P1582 倒水 解题报告

    P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...

  3. P1582 倒水 (数学)

    P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...

  4. 洛谷P1582 倒水

    P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...

  5. 洛谷P1582 倒水 二进制 lowbit __builtin_popcount

    P1582 倒水:https://www.luogu.org/problemnew/show/P1582 题意: 给定n瓶装有1升的水瓶,每次可以把两瓶装水量相同的水和成一瓶,问最少还要增加几瓶装有1 ...

  6. P1582倒水

    推了一个多小时的式子,ac后一看题解,7行代码搞定 emmmm我还是太菜了 传送 蒟蒻解法: 不管怎么倒水,最终所有瓶子里面的水的数量一定可以用2k表示出来. n最终可以合并成几个瓶子呢? 我们可以把 ...

  7. 洛谷 - P1582 - 倒水 - 位运算

    https://www.luogu.org/problemnew/show/P1582 要求用最少的瓶子,那肯定不能有两个一样的瓶子,否则合并更优. 枚举其二进制位,每次加上lowbit,将最后一个1 ...

  8. 洛谷P1582 倒水 二进制的相关应用

    https://www.luogu.org/problem/P1582 #include<bits/stdc++.h> using namespace std; long long N,K ...

  9. P1582 倒水(贪心 + lowbbit)

    https://www.luogu.com.cn/problem/P1582 #include <bits/stdc++.h> using namespace std; #define i ...

随机推荐

  1. vue 解决jsonp跨域

    在Vue中使用jsonp 参考链接:https://blog.csdn.net/m0_38134431/article/details/87930647 在vue中使用vue-jsonp 参考链接:h ...

  2. (八)Spring 事务管理

    目录 文章目录 @[toc] **`Spring`** 事务管理 `Api` 介绍之 **`PlatformTransactionManager`** 后记 #Spring 的事务管理 编程式事务管理 ...

  3. 剑指offer20:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    1 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 2. 思路和方法 利用辅助栈来存储现有栈的最小值.在入栈和出栈的时候将现有栈和最小 ...

  4. urllib的简单使用

    首先需要导包 Import urllib.request 这是一个简单的网站例如:发起请求Response = urlib.request.urlopen("http://www.baidu ...

  5. fiddler笔记:TimeLine时间轴选项卡

    1.TimeLine选项卡介绍 TimeLine选项卡支持使用"瀑布"模型查看1~250个选中的Session.主要用于帮助性能分析和理解请求之间的关联.选项卡的主体内容是数据流视 ...

  6. not or and 的优先级是不同的

    not or and 的优先级是不同的: not > and > or 请用最快速度说出答案: not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 an ...

  7. LeetCode 61——旋转链表(JAVA)

    给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...

  8. spark调优篇-spark on yarn web UI

    spark on yarn 的执行过程在 yarn RM 上无法直接查看,即 http://192.168.10.10:8088,这对于调试程序很不方便,所以需要手动配置 配置方法 1. 配置 spa ...

  9. django+uwsgi+nginx: websock 报502/400

    耽搁了近2个月,终于解决了,主要是nginx/uwsgi/django相关的配置: 一.django工程settings.py,添加 WEBSOCKET_FACTORY_CLASS = "d ...

  10. C# 7.0 语法

    C# 7.0的语法主要是优化了之前的写法,使得更加简洁方便.try catch when  这个使用场景很少,正常的开发无业务处理的时候不建议使用 . #region 2.字符串嵌入值 Console ...