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. kubernetes nodePort、targetPort、port、containerPort图解

    1. nodePort 外部机器可访问的端口. 比如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=,那么其他机器就可以通过浏览器访问scheme: ...

  2. 树莓派环境下使用python将h264格式的视频转为mp4

    个人博客 地址:https://www.wenhaofan.com/a/20190430144809 下载安装MP4Box 命令行下执行以下指令安装MP4Box   sudo apt-get inst ...

  3. layui的跳转链接实现分页low

    layui.use(['laypage', 'layer'], function(){ var laypage = layui.laypage ,layer = layui.layer; laypag ...

  4. 爬取豆瓣音乐TOP250的数据

    参考网址:https://music.douban.com/top250 因为详细页的信息更丰富,本次爬虫在详细页中进行,因此先爬取进入详细页的网址链接,进而爬取数据. 需要爬取的信息有:歌曲名.表演 ...

  5. app遮罩层--网赚

    css .mask{display: none; position: fixed; width: 100%; height: 100%; top:0; background: rgba(0, 0, 0 ...

  6. CTF中压缩文件的常见解法

    此篇记录两篇记录的比较好的关于压缩文件破解的总结 链接:https://blog.csdn.net/xuqi7/article/details/71437882 https://blog.csdn.n ...

  7. 原生js判断设备类型

    var u = navigator.userAgent; //Android终端 var isAndroid = u.indexOf('Android') > -1 || u.indexOf(' ...

  8. selenium统计网页加载时间

    参考网址: https://blog.csdn.net/thlzjfefe/article/details/99712974 https://blog.csdn.net/weixin_43664254 ...

  9. [SDOI2012] Longge的问题 - 欧拉函数

    求 \(\sum\limits_{i=1}^{n}gcd(i,n)\) Solution 化简为 \(\sum\limits_{i|n}^{n}φ(\dfrac{n}{i})i\) 筛出欧拉函数暴力求 ...

  10. windows 服务启动外部程序

    服务使用Process启动外部程序没窗体 在WinXP和Win2003环境中,安装服务后,右键单击服务“属性”-“登录”选项卡-选择“本地系统帐户”并勾选“允许服务与桌面交互”即可. 在Win7及以后 ...