1 条题解
-
0
西安市辅轮中学 校训,校风
西安市辅轮中学办学理念(你,都背过了吗?)
办学目标: 高质量 现代化 有特色 管理目标: 以严治校 以爱办学 培养目标: 优秀+特长 素质教育“六学会”: 学会做人 学会求知 学会健身 学会审美 学会劳动 学会协作 校 铭: 来为求知 去做栋梁 校 风: 团结勤奋 自律进取 校 训: 责任 荣誉 优秀的拆分题解
首先,这道题分送得很好(下回继续送)!- 我们先来从输出入手:
输出格式
如果这个数的所有拆分中,存在优秀的拆分。那么,你需要从大到小输出这个拆分中的每一个数,相邻两个数之间用一个空格隔开。可以证明,在规定了拆分数字的顺序后,该拆分方案是唯一的。 若不存在优秀的拆分,输出
-1
。可以看出,题目要求我们从大到小的输出,由此,我们可以想到一个思路:
贪心:
先进行特判:
- 偶数一定可以进行拆分,∵优秀的拆分如果加上 就是二进制,可以表示任何数,且偶数在二进制中末位一定不为1(不需要证明吧)。所以偶数一定可进行“优秀的拆分”。
- 奇数一定不可以进行拆分,**∵凡不是,2的自然数幂皆 ,∴奇数一定不可以拆分为*
对于偶数
我们从大到小,从依次枚举2的正整数次幂,如果大于该数,则输出该数,如果小于该数,则跳过。 可以证明,这条性质是对的,请大家自证(模仿CCF的题面)
代码:(不得抄袭,不得借鉴,没有防伪,凭人品了)
#include <bits/stdc++.h> using namespace std; int n; int main() { scanf ("%d", &n); if (n % 2 == 1) { printf("%d", -1); return 0; } for (int i = 23; i >= 1; i--) if (n >= (1 << i)) printf("%d ", (1 << i)), n -= 1 << i; return 0; }
没错,就是如此之水————
信息
- ID
- 24
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 39
- 已通过
- 14
- 上传者