【t088】倒水
Time Limit: 1 second 
Memory Limit: 128 MB
【问题描述】
一天辰辰买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着辰辰发现瓶子实在太多了,于是他决定保留不超 
过K个瓶子,每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃(不能丢弃有水的瓶 
子)。 显然在某些情况下辰辰无法达到目标,比如N=3,K=1。此时辰辰会重新购买一些新的瓶子(新瓶子容量无限,开始时有1升水) 
以达到目标。 
现在辰辰想知道最少需要多少新瓶子才能达到目标呢? 
【数据规模】 
对于50%的数据,n<=10^7;对于100%的数据如题目。 
【提示】考虑lowbit运算  
【输入格式】
输入文件一行两个正整数N和K,其中1<=n<=10^9,k<=1000。
【输出格式】
输出文件包含一个非负整数,表示最少需要购买的瓶子数量。
Sample Input
3  1 
Sample Output
1
Sample Input2
13  2 
Sample Output2
3
Sample Input2
1000000  5 
Sample Output2
15808
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t088
【题解】 
 
首先把n转换成二进制; 
这个n能够分成的最小的水的数量就为二进制中1的个数; 
因为2^x的水能够合成1瓶水; 
然后考虑这样的形式 
1 0 1 1 1 0 
如果想让1的个数变少一点; 
可以考虑加上最低位的1对应的数字这里即2 
然后就会变成 
1 1 0 0 0 0 
这样做最少能保证消掉一个0、加上1个0,而且可能会有上面的消除多个0的情况,所以肯定不会变差(1的个数肯定不会变多); 
一直重复上述过程直到1的个数小于等于k就好 
(如果写过树状数组就知道lowbit操作了x&(-x)就是获取最低的1对应的数字) 
 
【完整代码】
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXN = 100;
int n,k;
int cnt = 0,ans = 0;
int get_num(int n)
{
    cnt = 0;
    while (n)
    {
        cnt+=(n&1);
        n>>=1;
    }
    return cnt;
}
int main()
{
    //freopen("F:\\rush.txt","r",stdin);
    rei(n);rei(k);
    while (get_num(n)>k)
    {
        ans+=(n&(-n));
        n=n+(n&(-n));
    }
    printf("%d\n",ans);
    return 0;
}
【t088】倒水的更多相关文章
- 广度优先搜索  cdoevs 1226 倒水问题
		
cdoevs 1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升 ...
 - 倒水问题 (codevs 1226) 题解
		
[问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, ...
 - POJ 3414 Pots【bfs模拟倒水问题】
		
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
 - yzoi1777倒水问题的详细解法
		
Description - 问题描述 x.y.z三个容器,其最大容量分别是xMAX升.yMAX升.zMAX升,这里规定100>xMAX>yMAX>zMAX.一开始x是装满了水的,现在 ...
 - codevs1226倒水问题(Bfs)
		
/* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有 ...
 - 倒水问题-->经典面试题目
		
题目详细: 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水.我们还有一个足够大的水缸,足够容纳C升水.起初它是空的,我们只能往水缸里倒入水,而不能倒出.可以进行的操作是:把一个容器灌满 ...
 - 倒水问题 (FillUVa 10603) 隐式图
		
题意:本题的题意是给你三个杯子,第一二个杯子是空的,第三个杯子装满水,要求是量出一定容量d升的水.若是得不到d升的水,那就让某一个杯子里面的水达到d',使得d'尽量接近d升. 解题思路:本题是给出初始 ...
 - uva10603 倒水问题
		
状态搜索.类似八数码问题 AC代码 #include<cstdio> #include<queue> #include<cstring> #include<a ...
 - 美团codeM预赛A轮 倒水
		
[编程题] 倒水 时间限制:1秒 空间限制:32768K 有一个大水缸,里面水的温度为T单位,体积为C升.另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升. 现在 ...
 
随机推荐
- day39-Spring 11-Spring的AOP:基于AspectJ的XML配置方式
			
package cn.itcast.spring3.demo2; import org.aspectj.lang.ProceedingJoinPoint; /** * 切面类 * @author zh ...
 - oracle限制一个用户空闲时间
			
alter system set resource_limit = true; create profile idletime limit idle_time 3; alter user outln ...
 - js赋值符号“=”的小例子
			
var obj1={x:5}; var obj2=obj1; obj1.a=obj1={x:6}; console.log(obj1.a); console.log(obj2.a); 为什么obj1. ...
 - 两种最常用的 HTTP 方法:GET 和 POST。
			
什么是 HTTP? 超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信. HTTP 的工作方式是客户机与服务器之间的请求-应答协议. web 浏览器可能是客户端,而计算机上的网络应用程 ...
 - SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度
			
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...
 - TIJ——Chapter Thirteen:Strings
			
String 对象是不可修改的,对于被String 重载的'+' 和'+=' 运算符来说,当你用它们来连接两个String 对象的时候,它在底层并不会对于每一次连接均生成一个String 对象,取而代 ...
 - 通过 PHP OPcache 提升 Laravel 应用运行速度
			
什么是 OPcache 每一次执行 PHP 脚本的时候,该脚本都需要被编译成字节码,而 OPcache 可以对该字节码进行缓存,这样,下次请求同一个脚本的时候,该脚本就不需要重新编译,这极大节省了脚本 ...
 - WebGL three.js学习笔记 加载外部模型以及Tween.js动画
			
WebGL three.js学习笔记 加载外部模型以及Tween.js动画 本文的程序实现了加载外部stl格式的模型,以及学习了如何把加载的模型变为一个粒子系统,并使用Tween.js对该粒子系统进行 ...
 - LeetCode91 Decode Ways
			
题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...
 - Java面向对象----继承概念,super关键字
			
继承概念: 继承需要符合的关系 is-a , 父类通用更抽象,子类更特殊更具体 类之间的关系 继承体现 组合体现 实现接口体现 继承的意义 代码重用 体现不同抽象层次 extends关键字 Sup ...