P1582 倒水】的更多相关文章

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 倒水 题目描述 一天,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()…
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…
https://www.luogu.com.cn/problem/P1582 #include <bits/stdc++.h> using namespace std; #define int long long int n,k; //取出1的个数 int check(int x){ ; for(;x;x -= x & -x){ c++; } return c; } int ans; signed main(){ ios::sync_with_stdio(); cin >>…
传送门 思路: 类似于 袁绍的刁难 , 一道二进制的模拟题. 先将:将原先的瓶子数 n 转换成二进制,二进制中 1 的个数就是合并后剩下的瓶子个数 . 主要利用树状数组的 lowbit 函数: inline LL lowbit(LL u) { LL res=0; for(;u;u-=u&-u) res++; return res; }//统计二进制 1 的个数. 若二进制 1 的个数 > k ,不断将二进制中最低位的 1 加 1 ,重新统计 1 的个数 ,直到 1 的个数 ≤ k. Code…
题目 分析 这个题并不难,只是需要仔细思考我们首先可以很轻松的把这个题给疏通一下题意. 1:首先我们最后每个瓶子中装的水一定是一个$2^x$,因为每次都是$2$倍的加,这个应该很好理解. 2:我们要明白$n$转换成二进制后,所含$1$的个数是什么意思,可以从二进制的定义里面找,个数即是每个数如果分成多个二进制数的话,所需的二进制数的个数. 3:其次我们明白这剩下的$k$个瓶子代表什么意思,它代表着当前的水量(即$n$)转变成二进制后该数的1的数目一定要$<=k$ 为什么呢,我们想一下,如果该数目…
题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多少新瓶子才能达到目标呢? 输入输出 输入格式: 一行两个正整数, N,K(1≤N≤2e9…
题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多少新瓶子才能达到目标呢? 输入输出格式 输入格式: 一行两个正整数, N,K( 1\le…
题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多少新瓶子才能达到目标呢? 输入输出格式 输入格式: 一行两个正整数, N,K(1\le…
这道题实际上是考二进制 很容易看出杯子水量一定是2的i次方 所以n杯水最后剩下的水一定是n用二进制表示中1的个数 所以就枚举n来求什么时候1的个数小于k 那么这里有个优化,不然会超时 因为每次加的目的是要让1的个数变少,也就是要进位 所以每次加上的是lowbit(n) #include<cstdio> #define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) for(int i = (a); i &…
题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多少新瓶子才能达到目标呢? 输入格式 一行两个正整数, N,K(1\le N\le 2\t…
有n个瓶子,里面都有一升水,但是只想保留k个瓶子,只能两个瓶子里面的水体积相等时才能倒在一个瓶子里:不能丢弃有水的瓶子:瓶子容量无限: 问需要购买几个额外的瓶子才能满足条件: 因为每个瓶子一开始只有一升水,那么合并后每个瓶子里面的水体积都是2i,也就是说,n个瓶子最少能合并成n的二进制数中1的个数个瓶子: 那么我们要买多少个瓶子呢?面对一个二进制数,我们因为要让他的1的个数变小,我们要加上lowbit (x&(-x)),这个表示的是保留这个数从右边起第一个1的位置, 比如:100010 lowb…
来水一发水题.. 题目链接. 正解开始: 首先,我们根据题意,可以得知这是一个有关二进制的题目: 具体什么关系,怎么做,我们来具体分析: 对于每个n,我们尝试将其二进制分解,也就是100101之类的形式 根据瓶子合并的特性,我们可以判定最后每一个瓶子内的水都可以表示成2^i的形式 感性理解:对于每一个数位上为1的地方,自然,他可以经过多次合并(瓶子加水)来合成,因为每个瓶子内的水都可以表示成2^i的形式,也就对应着n二进制分解上的一个1. 说白了就是从开始的那一堆瓶子里面进行合成,最后在不加瓶子…
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static long m = 0, f = 0; public static void main(String[] args) { FastScanner fs = new FastScanner();…
https://www.luogu.org/problem/show?pid=1582 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多…
详解 该函数的主要作用是计算一个数字的二进制中有多少个1,返回值就是其中1的个数. 它使用一张基于表的方法来进行位搜索,因此这个操作的执行效率很高 此处举一题 P1582 倒水 #include <bits/stdc++.h> using namespace std; #define lowbit(x) x&(-x) int main() { int n,k; scanf("%d%d",&n,&k); int ans=n; while(__built…
倒水 题目链接 显然,2^x个杯子里的水可以倒在一个杯子里 所以我们可以贪心地每次将N中最大的2^x减掉 减k次(若中途已经为0,直接输出0) 若大于0,用最小的比N大的2^x减剩下的N,即为答案 #include<cstdio> #include<cmath> int n,k,ans,i; int main() { scanf("%d%d",&n,&k); ;i<k;i++){ n-=(<<int(log2(n))); if(…
这个题我很无语,一开始看绿题,还是数论,应该不会特别简单,应该要动笔写上好一会,过了一会旁边 #祝神 说这原来是个蓝题,我顿时觉得十分迷茫... 结果看了这个题看了一会,仔细一想,woc,这题怕不是可以暴力出解,况且这个范围确实也够了啊,妥妥0ms出解..就试着打了一下..然后T两个点...过了一会,发现2在进行乘的时候,如果n足够大,会爆出int,所以改成longlong. #include<iostream> #include<cstdio> #include<cmath…
cdoevs 1226 倒水问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知 x 升壶为空 壶, y 升壶为空壶.问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z ( z ≤ 100 )升的水 来. 输入描述 In…
[问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, y升壶为空壶.问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z(z ≤ 100)升的水来. [样例输入] 3 22 1 [样例输出] 14 [解题思路] 看到求最少步数,马上想到用广度优先搜索,那么问题在于如何展开?要不要剪枝?其实,这道题是不需要任何剪枝的,只要判重就行了,那么关…
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#problem/J Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8253   Accepted: 3499   Special Judge Description You are given two pots, havin…
Description - 问题描述 x.y.z三个容器,其最大容量分别是xMAX升.yMAX升.zMAX升,这里规定100>xMAX>yMAX>zMAX.一开始x是装满了水的,现在要用这三个没有刻度的容器量出n升水来,请打印出最少的量取步骤. Input - 输入数据 输入只有一行,即4个整数: xMax  yMax  zMax n 其中100>xMax>yMax>zMax,n<100 Output - 输出数据 对于每个测试数据,输出其倒水步骤,如果步骤只有一…
/* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有两种情况:要么出水的为空 要么接水的满了 然后每次取队首时判断有没有某一个杯子装的水恰好为答案 注意判重时可以弄一个f [a][b] 表示第一个杯子有a升水 第二个杯子有b升水的状态存在了没 */ #include<iostream> #include<cstdio> #include…
题目详细: 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水.我们还有一个足够大的水缸,足够容纳C升水.起初它是空的,我们只能往水缸里倒入水,而不能倒出.可以进行的操作是:把一个容器灌满:把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸):用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满. 问是否能够通过有限次操作,使得水缸最后恰好有C升水. 输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000输出:0或1,表示能否达到…
题意:本题的题意是给你三个杯子,第一二个杯子是空的,第三个杯子装满水,要求是量出一定容量d升的水.若是得不到d升的水,那就让某一个杯子里面的水达到d',使得d'尽量接近d升. 解题思路:本题是给出初始状态,让你寻找一条通往目标的路径,此题也可看成是有向图中在起点和目标点之间寻找一条最短路径,但是这个最短路径不是距离最短而是倒的水最少,所以这题类似于Dijkstra算法求最短路,利用广搜,一直选当前水量最少的结点进行扩展,所以可以建立一个优先队列来存储下一次要访问的结点,同时将访问过的结点标记一下…
状态搜索.类似八数码问题 AC代码 #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; const int maxn=200+5; int vis[maxn][maxn];//是否访问过该节点 struct node { int fill[3]; //当前状态的水的分布 int dist; //当前状态倒水量 bool oper…