国王的瓷器(题解)

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

【问题描述】
一个波斯的国王喜欢来自东方的瓷器,需要从波斯商人那去购买,为了避免瓷器损环,商人将瓷器安全地放在包装箱里。国王给商人提出一个瓷器的包装要求,即如果国王向商人要求购买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;
}

### 蓝桥杯 C++ 竞赛题解 #### 题目A解析 对于给定的计算逻辑,程序通过迭代找到满足特定条件的第一个整数`i`以及对应的`y`值并输出其和。具体实现如下: ```cpp #include <iostream> #include <cmath> int main() { int a = 2019 * 2019; for (int i = 2020;; ++i) { int x = 2 * i * i - a; int y = sqrt(x); if (y * y == x && i < y) { std::cout << i + y << std::endl; break; } } return 0; } ``` 此段代码旨在求解一个数学表达式的最小正整数解[^1]。 #### 关于训练平台的选择 针对蓝桥杯准备而言,不建议仅依赖LeetCode作为主要练习资源。尽管LeetCode提供了大量高质量编程挑战,但这些题目更侧重于求职面试场景下的算法考察,而非竞赛环境中的全面能力测试。相比之下,更适合参与者的备选方案包括其他专注于信息学奥林匹克或ACM风格的比赛网站及教材资料[^2]。 #### 实际比赛策略分享 当面对实际比赛中遇到的问题时,有时采用简单直接的方法反而能有效解决问题而不必担心性能瓶颈。例如,在处理某类问题时可以通过简单的线性扫描完成任务而无需构建复杂的多层循环结构来优化效率。下面是一个具体的例子展示了如何利用这一思路快速得出结果: ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; ++i) { cout << max(i * 2, (n - i - 1) * 2) << endl; } return 0; } ``` 这段代码实现了对一系列数值的最大化操作,并且由于采用了非嵌套的一维遍历方式,确保了即使在较大规模的数据集下也能保持良好的执行速度[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值