zoukankan      html  css  js  c++  java
  • 鬼谷子的钱袋(lgP2320)

    主要思路:二进制拆分。

    先将 (m) 进行二进制拆分。

    注意金币总数有限,也就是说拆分后可能会多出来一组。多出来的这组如果不是 (2^n) 就不需要考虑了,因为不会和前面的重复。

    接下来考虑重复的情况,如 (m=23) ,可以拆为 (1 2 4 8 8)

    于是我们直接把俩 (8) 变成 (7)(9)

    当我们需要用 (8) 时,直接用 (7+1) 。如果还需要 (1),就直接用 (9) 。故可以保证正确性。

    代码就很简单了。

    #include<bits/stdc++.h>
    using namespace std;
    int m,ans[101],k=1;
    int main()
    {
    	int cnt=0;
    	scanf("%d",&m);
    	while(k<=m)
    	{
    		m-=k;
    		ans[++cnt]=k;
    		k<<=1;
    	}
    	if(m) ans[++cnt]=m;
    	for(int i=1;i<cnt;i++)
    	{
    		if(ans[i]==ans[cnt]&&ans[cnt]!=1)
    		{
    			ans[i]++;
    			ans[cnt]--;
    			break;
    		}
    	}
    	sort(ans+1,ans+cnt+1);
    	cout<<cnt<<endl;
    	for(int i=1;i<=cnt;i++)
    	{
    		cout<<ans[i]<<" ";
    	}
    	return 0;
    }
    
  • 相关阅读:
    Linux Shell脚本编程--Head/Tail命令详解
    Python学习笔记-抽象
    L2-020 功夫传人
    pat 抢红包
    pat 集合相似度
    pat 喊山
    hdu1029
    win10 , JAVA安装 环境搭建
    ZOJ2540 Form a Square
    ZOJ3180 Number Game
  • 原文地址:https://www.cnblogs.com/ying-xue/p/14346971.html
Copyright © 2011-2022 走看看