国王的瓷器(题解)

该博客讨论了一种优化问题,涉及如何将瓷器以2的幂次形式包装,以满足国王的购买需求并最小化包装成本。当国王购买任意数量的瓷器时,商人需要预先打包,使得每个包裹中瓷器的数量为2的整数次幂。样例解释了如何将19件瓷器拆分为16(2^4)、2(2^1)和1(2^0)的方式。代码实现通过不断减去2的幂次来得到解决方案。
摘要由CSDN通过智能技术生成

【问题描述】
一个波斯的国王喜欢来自东方的瓷器,需要从波斯商人那去购买,为了避免瓷器损环,商人将瓷器安全地放在包装箱里。国王给商人提出一个瓷器的包装要求,即如果国王向商人要求购买N件瓷器,商人在不知道具体数量时必须给出整箱的瓷器,不能拆开包装箱。
商人当然可以使用1个包装箱包装1件瓷器来满足国王地需求,但是为了节省包装成本,如何将手中的瓷器进行包装既能满足国王的要求又能节省成本。请你编写程序输出国王购买N件瓷器时,每个包装中的瓷器数量,数量按照从大到小的次序输出。
【输入形式】
一个整数N。(0<N<2^31)
【输出形式】
空格隔开的每个包装的数量,从大到小排序。
【样例输入】
19
【样例输出】
16 2 1
【样例说明】
商人事先不知道国王的购买数量,需要先将瓷器包装好以满足各种可能。

========================================
分割线

这题读了好长时间还是不能理解题意,不过看给的样例大致猜出了题意:大致就是将一个整数化解成2的a1,a2,a3…之和,且尽可能的少,例如:19=16+2+1,38=32+4+2
然后根据此猜想解题 居然1A过了 注意的是8= 8 这种特殊情况

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath> 
using namespace std;

int main()
{
	long long num; 
	long long cnt1,cnt2;
	cin>>num;
	long long ans=num;  //使ans来代替num ,不用也可以
    while(ans>0){  //进行数的拆分
    	cnt1=log(ans)/log(2);
    	if(pow(2,cnt1+1)==ans) cnt1++;    //即特判8=8 等情况不被继续分解
        cnt2=pow(2,cnt1);
      printf("%d ",cnt2	);
    	ans-=pow(2,cnt1);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值