Java实现 洛谷 P1582 倒水】的更多相关文章

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();…
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); //…
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…
题目 分析 这个题并不难,只是需要仔细思考我们首先可以很轻松的把这个题给疏通一下题意. 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\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 &…
https://www.luogu.org/problem/show?pid=1582 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃.(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1.此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标. 现在CC想知道,最少需要买多…