P1582 倒水 (数学)】的更多相关文章

P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多少新瓶子才能达到目标呢? 输入输出格式 输入格式: 一行两个正整数,…
题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多少新瓶子才能达到目标呢? 输入格式 一行两个正整数, N,K(1\le N\le 2\t…
P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多少新瓶子才能达到目标呢? 输入输出格式 输入格式: 一行两个正整数,\…
P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多少新瓶子才能达到目标呢? 输入输出格式 输入格式: 一行两个正整数,…
P1582 倒水:https://www.luogu.org/problemnew/show/P1582 题意: 给定n瓶装有1升的水瓶,每次可以把两瓶装水量相同的水和成一瓶,问最少还要增加几瓶装有1升的水瓶,使得最后装水的瓶子减少为k瓶以下. 思路: 这道题没想到用到了二进制,最后水瓶中的容量一定是2的指数次,利用lowbit函数可以知道一个数加到2的某个指数次需要多少个数.每次我们就给n加上lowbit(n),如果n在二进制表示中,1的总个数小于k,则加够了.这个计数也可以用lowbit()…
有n个瓶子,里面都有一升水,但是只想保留k个瓶子,只能两个瓶子里面的水体积相等时才能倒在一个瓶子里:不能丢弃有水的瓶子:瓶子容量无限: 问需要购买几个额外的瓶子才能满足条件: 因为每个瓶子一开始只有一升水,那么合并后每个瓶子里面的水体积都是2i,也就是说,n个瓶子最少能合并成n的二进制数中1的个数个瓶子: 那么我们要买多少个瓶子呢?面对一个二进制数,我们因为要让他的1的个数变小,我们要加上lowbit (x&(-x)),这个表示的是保留这个数从右边起第一个1的位置, 比如:100010 lowb…
https://www.luogu.org/problem/show?pid=1582 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多…
https://www.luogu.org/problemnew/show/P1582 要求用最少的瓶子,那肯定不能有两个一样的瓶子,否则合并更优. 枚举其二进制位,每次加上lowbit,将最后一个1加上. 显然最多logn次. #include<bits/stdc++.h> using namespace std; #define ll long long ll n,k; int main(){ cin>>n>>k; bitset<32> b(n); //…
推了一个多小时的式子,ac后一看题解,7行代码搞定 emmmm我还是太菜了 传送 蒟蒻解法: 不管怎么倒水,最终所有瓶子里面的水的数量一定可以用2k表示出来. n最终可以合并成几个瓶子呢? 我们可以把n分解为多个2k相加的形式,例如:13=23+22+20,所以13最少合并到3个瓶子里面 求n最少能合并到几个瓶子里面,正是看n的二进制表示里面有多少个1 如果1的数量cnt小于等于k,则直接输出0. 否则:从第一个是1的位置+1开始,扫到cnt-k+1个1的位置,中间如果是0,ans就加上2是0的…
https://www.luogu.org/problem/P1582 #include<bits/stdc++.h> using namespace std; long long N,K,x,ans,k; bool a; int main() { cin>>N>>K; ;) { // register关键字请求让编译器将变量a直接放入寄存器里面,以提高读取速度 ==) { x++; } i>>=; //二进制下为除去最后一位,十进制下为除以2 } if(x…