1 条题解

  • 0
    @ 2026-10-27 12:58:41

    思路与算法

    每支笔至少4元,所以笔数不超过q=floor(x/4)。若恰买q支,设6元和5元笔数为a,b,则比全买4元笔多花2a+b=x%4元。枚举这一至多3元的余数即可:让a=floor((x%4)/2)、b=(x%4)%2,其余q-a-b支是4元笔。x小于4或等于7时无解。

    正确性说明

    当x≥8时q≥2,而上式所需a+b≤2,故笔数上界q可达到。x=4,5,6分别可单买一支,x=7无法由4/5/6的非负组合表示。固定最优q后,2a+b=r≤3,a最多floor(r/2),取最大a后b唯一,因此满足修订题面并列规则。

    复杂度

    读入和初始化均为常数操作;时间O(1),空间O(1)。x及支数使用64位整数,可覆盖10^18。

    易错点

    必须恰好花完,不能只输出x/4支4元笔。注意7元虽然大于最低单价仍无解。样例10元的两支5元笔也最优,但本地规范优先更多6元笔,所以输出1 0 1。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        long long x;
        cin >> x;
        if (x < 4 || x == 7) {
            cout << -1 << "\n";
            return 0;
        }
        long long n = x / 4, r = x % 4, a = r / 2, b = r % 2;
        cout << a << ' ' << b << ' ' << n - a - b << "\n";
    }
    
    • 1

    信息

    ID
    2060
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者