P2320 [HNOI2006]鬼谷子的钱袋

挺有趣的一道题,之所以发这篇题解是因为感觉思路的更清晰一点qwq

此题主要有两种方法:

一、分治思想

例如要凑出120,假如我们已经能凑出110了,那么只要再有一个10元的钱袋,便可以凑出11~20

同理,再要凑出110,则需要凑出15+一个5元的钱袋

就这样不断分治,那么每次n/2都是一定会选的数

如果n是奇数,如21,那么只要凑出1~10加上一个11元的钱袋即可

#include<iostream>
using namespace std;
int m,k,a[31]; //2^30>10^9
int main(){
cin>>m;
while(m) a[++k]=(m+1)/2,m/=2; //每次m/2都是一定会选的数
cout<<k<<"\n";
for (int i=k;i;i--) cout<<a[i]<<" "; //数组递减,倒序输出
}

二、二进制拆分

类似多重背包问题的二进制分解思想,2n以内的以内的所有数都可以用20,21,22.......2^(n-1)表示出来,且用的数字最少

例如要表示出23以内的所有数,把23二进制拆分:23=20+21+22+23+8=1+2+4+8+8(最后的8是拆分后的余数),也就是用1,2,4,8,8可以凑出1~23。

也许你会问:1,2,4,8以二进制的方式可以凑出115,但是1622之间的数就一定能用1,2,4,8,8凑出来吗?

其实16~22中的任一个数都可以表示成23-x(0<x<8)的形式,而对于0<x<8是一定可以用1,2,4,8凑出的,实际上就是从1,2,4,8,8中去掉几个钱袋而已。

同理,如果要表示出m以内的数:拆分m=20+21+22+......+2n+余数,对于m-x(0<x<余数),x一定可以用20+21+22+......+2n表示出来(如果无法表示则说明x>20+21+22+......+2n即x>=2^(n+1),那么x还可以继续拆分,与题意不符)

此外还要注意不得有两个钱袋装有相同的大于1的金币,对于23中的两个8,可以改为7,9(由于凑出数时1是肯定要用上的,当我们需要用8时,直接用7+1就可以,如果还需要1,7+1+1,直接用9就好了,当然最好还是有special judge)。由于2^n是递增的,所以最多是余数与一个数相同,特判即可,不需排序。

代码长了一些主要是因为特判,然而似乎比分治稍微快一点qwq?

#include<cstdio>
using namespace std;
int m,n,a[31];
bool flag; //是否有余数?
int main() {
scanf("%d",&m);
for (int x=1; x<=m; x<<=1)
a[++n]=x,m-=x; //二进制拆分
n++;
if (m) a[n]=m; //余数
else flag=1;
printf("%d\n",n-(flag==1)); //没有余数就-1
for (int i=1; i<n; i++) {
if (!flag) { //如果余数还没输出,则判断当前位置是否该输出余数了
if (a[i]==a[n]) printf("%d ",a[n]-1),a[i]++,flag=1; //余数与一个数相同
else if (a[n]<a[i]) printf("%d ",a[n]),flag=1; //没有数与余数相同,按顺序输出
}
printf("%d ",a[i]);
}
if (!flag) printf("%d",a[n]); //如果余数最大
}

题解 P2320 【[HNOI2006]鬼谷子的钱袋】的更多相关文章

  1. P2320 [HNOI2006]鬼谷子的钱袋

    洛谷2320 06湖南 鬼谷子的钱袋 来源 题目描述 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政.有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的拍卖行(聚宝商行 ...

  2. 洛谷P2320 [HNOI2006]鬼谷子的钱袋

    https://www.luogu.org/problem/show?pid=2320#sub 题目描述全是图 数学思维,分治思想 假设总数为n 从n/2+1到n的数都可以用1~n的数+n/2表示出来 ...

  3. P2320 [HNOI2006]鬼谷子的钱袋——进制(没事就别看这个了)

    就是n可以被1到n/2的所有数表示出来: 我一开始写了个把二进制数里的1拿出来,但是WA了两个点: 分治? 好多人说数据有问题,我也不知道,也不想知道: %:include<cstdio> ...

  4. 洛谷 P2320 [HNOI2006]鬼谷子的钱袋

    题目传送门 解题思路: 对于每一个数i,我们都可以用i/2来表示,而对于i/2我们可以用i/4表示......(以此类推) 举个例子,对于10,我们可以用5 + 5来表示,而5可以用 3 + 2表示, ...

  5. BZOJ 1192: [HNOI2006]鬼谷子的钱袋 数学结论

    1192: [HNOI2006]鬼谷子的钱袋 Description 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政.有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的 ...

  6. BZOJ [HNOI2006]鬼谷子的钱袋

    1192: [HNOI2006]鬼谷子的钱袋 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5367  Solved: 3646[Submit][St ...

  7. 1192: [HNOI2006]鬼谷子的钱袋

    1192: [HNOI2006]鬼谷子的钱袋 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3530  Solved: 2575[Submit][St ...

  8. BZOJ 1192: [HNOI2006]鬼谷子的钱袋(新生必做的水题)

    1192: [HNOI2006]鬼谷子的钱袋 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3557  Solved: 2596[Submit][St ...

  9. bzoj千题计划172:bzoj1192: [HNOI2006]鬼谷子的钱袋

    http://www.lydsy.com/JudgeOnline/problem.php?id=1192 1,2,4,8,…… n-2^k 可以表示n以内的任意数 若n-2^k 和 之前的数相等,一个 ...

随机推荐

  1. 在页面布局中,CSS如何实现左侧宽度固定,右侧宽度自适应的布局?

    首先给出DOM结构 <divclass="box"> <divclass="box-left"></div> <div ...

  2. vue自学入门-4(vue slot)

    vue自学入门-1(Windows下搭建vue环境) vue自学入门-2(vue创建项目) vue自学入门-3(vue第一个例子) vue自学入门-4(vue slot) vue自学入门-5(vuex ...

  3. HashMap源码刨析(面试必看)

    目录 1.Hash的计算规则? 2.HashMap是怎么形成环形链表的(即为什么不是线程安全)?(1.7中的问题) 3.JDK1.7和1.8的HashMap不同点? 4.HashMap和HashTab ...

  4. ansi sql 语法 切换为 oracle 语法

        语句粘贴到 工作表 打开查询构建器 勾选 创建oracle连接 over     sql dev 的语法设置调整,否则表别名会右对齐   下面是 转换后的结果,是不是看得舒服多了

  5. python3爬取淘宝商品(失效)

    最近有人反映淘宝的搜索功能要登录才能用,原先的直接爬取的方法挂了.稍微把之前的代码修改了一下,登录采用最简单的复制cookie来解决. 顺便说一下,这只是根据搜索的的索引界面获取的信息,并未深入的获取 ...

  6. mac /windows

    1.mac 和 windows 同样的浏览器展示的样式有偏差 考虑:字体的问题,mac/windows 的字体不一样 font-family 用法

  7. 关闭visual studio code 智能提示功能

    对于程序初学者来说,应该少用IDE的提示功能,因为这样有助于记住一些常用的函数等功能.这也是为什么戏称喜欢用notepad++(windows)或者vim编辑器(Linux)来开发代码是大神的原因,而 ...

  8. hdu1005 矩阵快速幂

    #include<iostream> #include<cstdio> #include<cstring> #include<set> #include ...

  9. Spring IoC详解

    Spring IoC详解 1. 控制反转 控制反转是一种通过描述(XML或者注解)并通过第三方去产生或获取特定对象的方式.在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Depend ...

  10. 改变容器Size后,刷新地图大小。

    You need to call the API to update map size. http://dev.openlayers.org/docs/files/OpenLayers/Map-js. ...