当前位置: 首页 > news >正文

洛谷P1582 倒水

 

题目描述

一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)

显然在某些情况下CC无法达到目标,比如N=3,K=1。此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标。

现在CC想知道,最少需要买多少新瓶子才能达到目标呢?

输入输出格式

输入格式:

 

一行两个正整数, N,K(1<=N<=10^9,K<=1000)。

 

输出格式:

 

一个非负整数,表示最少需要买多少新瓶子。

 

输入输出样例

输入样例#1:
   样例1:
3 1
   样例2:
13 2
   样例3:
1000000 5
输出样例#1:
   样例1:
1
   样例2:
3
   样例3:
15808

 

手推一下各种数据可以发现,最终状态应该是k个瓶子各有2^x的水量,总和大于n。

贪心,使k个瓶子里的水尽量少,而总和大于n。

刚开始的做法是贪心减去不大于剩余水量的最大的2的幂,然后计算需要添加多少水。

80分,懒得改了,直接写标算。

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #define LL long long
 8 using namespace std;
 9 LL n,k;
10 LL smm=0;
11 LL p[35];
12 int main(){
13     int i,j;
14     scanf("%lld%lld",&n,&k);
15     p[1]=1;
16     for(i=2;i<=32;i++){
17         p[i]=p[i-1]*2;
18     }
19     smm=0;
20     int pos=32;
21     while(p[pos-1]>=n)pos--;
22     LL ans=p[pos]-n;
23     if(ans<0)ans=p[32];
24     pos--;
25     while(k--){
26         while(smm+p[pos-1]>=n)pos--;
27         ans=min(ans,abs(smm+p[pos+1]-n));
28         smm+=p[pos];
29         if(smm>=n){
30             printf("%lld\n",min(ans,smm-n));
31             return 0;
32         }
33         pos--;
34     }
35     printf("%lld\n",ans);
36     return 0;
37 }
80

 

标算使用了位运算的思想。

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #define LL long long
 8 using namespace std;
 9 bool b[33];
10 int cnt;
11 LL s=0;
12 LL ans=0;
13 LL n,k;
14 int main(){
15     scanf("%lld%lld",&n,&k);
16     int i,j;
17     for(i=31;i>=0;i--){
18         LL tmp=pow(2,i);
19         if(n>=tmp){
20             n-=tmp;
21             b[i]=1;
22             cnt++;
23         }
24     }
25     s=0;
26     while(cnt>k){
27         for(i=s;;i++){
28             if(b[i]){
29                 s=i;b[i]=0;
30                 break;
31             }
32         }
33         for(i=s+1;;i++){
34             if(b[i]){
35                 b[i]=0;
36                 cnt--;
37                 int x=i+1;
38                 while(b[x]){
39                     b[x]=0;
40                     x++;
41                     cnt--;
42                 }
43                 b[x]=1;
44                 ans+=pow(2,i)-pow(2,s);
45                 s=x;
46                 break;
47             }
48         }
49     }
50     cout<<ans<<endl;
51     return 0;
52 }

 

转载于:https://www.cnblogs.com/SilverNebula/p/5911089.html

相关文章:

  • ISA 2004 進階管理實務
  • PHP系列目录
  • 怎样成为优秀的软件测试员
  • 无法创建链接服务器 xxx 的 OLE DB 访问接口 OraOLEDB.Oracle 的实例。 (Microsoft SQL Server,错误: 7302)...
  • 使用Java操作文本文件的方法详解
  • 随笔
  • Redis集群搭建与简单使用
  • 自动压缩MS SQL数据库日志
  • 五大绝招让你永远是人才
  • [转载]什么是IOC
  • 洛谷P3146 [USACO16OPEN]248
  • TechEd亲历图集
  • 秘制祖传正宗四川麻辣烫锅底配方
  • SqlPersistenceService数据库结构
  • 如何禁止内部viewPager滑动
  • 【Leetcode】101. 对称二叉树
  • HTTP请求重发
  • Java精华积累:初学者都应该搞懂的问题
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • 爱情 北京女病人
  • 力扣(LeetCode)21
  • 每天一个设计模式之命令模式
  • 设计模式 开闭原则
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 用Visual Studio开发以太坊智能合约
  • 正则表达式
  • 正则表达式小结
  • 自动记录MySQL慢查询快照脚本
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • scrapy中间件源码分析及常用中间件大全
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #{} 和 ${}区别
  • $refs 、$nextTic、动态组件、name的使用
  • (1)bark-ml
  • (1)常见O(n^2)排序算法解析
  • (2)nginx 安装、启停
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C++17) std算法之执行策略 execution
  • (day 12)JavaScript学习笔记(数组3)
  • (js)循环条件满足时终止循环
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (七)理解angular中的module和injector,即依赖注入
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四) 虚拟摄像头vivi体验
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net 垃圾回收机制原理(二)
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .net反混淆脱壳工具de4dot的使用
  • .NET连接数据库方式