题目

3008.买笔

代码

# 方法1
x = int(input())

pen_4 = int(x/4)
surplus = x%4

if(surplus == 3):
    print('{:d} {:d} {:d}'.format(1, 1, pen_4-2))
elif(surplus == 2):
    print('{:d} {:d} {:d}'.format(1, 0, pen_4-1))
elif(surplus == 1):
    print('{:d} {:d} {:d}'.format(0, 1, pen_4-1))
else:
    print('{:d} {:d} {:d}'.format(0, 0, pen_4))
# 方法2
x = int(input())

pen_4 = int(x/4)
pen_5 = pen_6 =0

surplus = x%4

while surplus>0:
    pen_4 -= 1
    surplus += 4
    
    if surplus%5==0:
        pen_5 += 1
        surplus -= 5
    elif surplus%6==0:
        pen_6 += 1
        surplus -= 6
    
print('{:d} {:d} {:d}'.format(pen_6, pen_5, pen_4)) 

算法思想

若想让笔的数量最大,应优先购买4元的。

以4为基准求余:

  • 剩1元,则4元钱的笔少买1支,换成1支5元笔;

  • 剩2元,则4元钱的笔少买1支,换成1支6元笔;

  • 剩3元,则4元钱的笔少买2支,换成1支5元笔和1支6元笔;

本题的主要思想是 贪心算法 ,方法1属于暴力解法,方法2有待优化(循环中的三块代码操作类似,可以通过函数来处理)

参考资料

题解 3008.买笔