1 条题解

  • 0
    @ 2023-10-11 0:03:46

    西安市辅轮中学 校训校风

    西安市辅轮中学办学理念(你,都背过了吗?)

    办学目标: 高质量 现代化 有特色
    管理目标: 以严治校 以爱办学
    培养目标: 优秀+特长
    素质教育“六学会”: 学会做人 学会求知 学会健身 学会审美 学会劳动 学会协作
    校 铭: 来为求知 去做栋梁
    校 风: 团结勤奋 自律进取
    校 训: 责任 荣誉

    优秀的拆分题解

    首先,这道题分送得很好下回继续送)!

    1. 我们先来从输出入手:
    输出格式

    如果这个数的所有拆分中,存在优秀的拆分。那么,你需要从大到小输出这个拆分中的每一个数,相邻两个数之间用一个空格隔开。可以证明,在规定了拆分数字的顺序后,该拆分方案是唯一的。 若不存在优秀的拆分,输出 -1

    可以看出,题目要求我们从大到小的输出,由此,我们可以想到一个思路

    贪心:

    先进行特判:
    1. 偶数一定可以进行拆分,∵优秀的拆分如果加上 202^{0} 就是二进制,可以表示任何数且偶数在二进制中末位一定不为1(不需要证明吧)。所以偶数一定可进行“优秀的拆分”
    2. 奇数一定不可以进行拆分,**∵凡不是202^{0},2的自然数幂皆 =0mod2 = 0(mod 2),∴奇数一定不可以拆分为2n+2n1+21n>12^{n} + 2^{n - 1} \ldots + 2^{1}(n > 1)*
    对于偶数

    我们从大到小,从2232^{23}依次枚举2的正整数次幂,如果nn大于该数,则输出该数,如果nn小于该数,则跳过。 可以证明,这条性质是对的,请大家自证(模仿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
    上传者