1 条题解
-
0
思路与算法
每支笔至少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