1 条题解

  • 0
    @ 2026-10-31 17:58:10

    思路

    要把 nn 分解成尽可能多的、大于 11 的奇数之和。

    设分成 kk 段。每段都是大于 11 的奇数,最小为 33,所以 n≥3kn\ge3k,即 k≤⌊n/3⌋k\le\lfloor n/3\rfloor;又因为 kk 个奇数之和与 kk 同奇偶,所以 k≡n(mod2)k\equiv n\pmod2。

    于是最大段数 qq:

    • n%3=0n\%3=0:q=n/3q=n/3,用 n/3n/3 个 33;
    • n%3=2n\%3=2:q=⌊n/3⌋q=\lfloor n/3\rfloor,用 ⌊n/3⌋−1\lfloor n/3\rfloor-1 个 33 和一个 55;
    • n%3=1n\%3=1:k=⌊n/3⌋k=\lfloor n/3\rfloor 与 nn 奇偶性不同(相差 11),取不到,最大只能是 q=⌊n/3⌋−1q=\lfloor n/3\rfloor-1;构造上把两个 33 和一个 11 合成一个 77:用 ⌊n/3⌋−2\lfloor n/3\rfloor-2 个 33 和一个 77(n=7n=7 时就是单独一个 77),恰好 qq 段。

    n=1,2,4n=1,2,4 无解:它们无法写成大于 11 的奇数之和(44 只能写成 3+13+1,而 11 不合法)。

    每组 O(1)O(1) 计算,总复杂度 O(t)O(t),空间复杂度 O(1)O(1)。

    代码

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int t; cin >> t;          // 测试数据组数
        while(t--)
        {
            long long n; cin >> n;
            if(n == 1 || n == 2 || n == 4)// 这三种情况无法拆分,无解
            {
                cout << -1 << endl;
            }
            else
            {
                int k = n % 3;
                if(k == 0 || k == 2) cout << n / 3 << endl;   // 余 0:全用 3;余 2:把最后的 2 并成 5
                else cout << n / 3 - 1 << endl;               // 余 1:少用一个 3,与 1 合成 7
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    31
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者