Python-CCF:20190901 小明种苹果

题目

在这里插入图片描述在这里插入图片描述

用时

读题+分析:10min
写代码:70min

虽然是一遍过,但不是很满意,用时太长了
不过考虑到是隔了好久再做CSP,手生是正常的
毕竟和平时写爬虫写Django不一样,CSP对细节的要求更高,稍有不慎失去的可能就是几十分
所以大体来说差强人意吧

思路分析

  1. 输入分析
    在这里插入图片描述
    第一个3是指3棵苹果树
    第二个3是指修剪每棵苹果树修剪3轮
    这里容易受到误导,一定注意
    73是指第一棵树开始时有73个苹果
    -8、-6、-4分别是每轮修剪8个、6个、4个
    下同
  2. 数据结构分析
    每棵苹果树都有
    属性:树的编号、苹果个数、被修剪苹果的总数
    方法:修剪,传入参数为每次修剪的个数
    很自然的想到用类和对象去写
  3. 其他注意事项
    输出的编号是从1开始的,也就是说没有第0棵树这种说法,如果想用下标表示编号一定要注意
    第二个输入示例中涉及到了相同元素的排序顺序,Python的sort方法是稳定的,正好符合要求
    输入的修剪个数为非正数,所以定义修剪方法时要分清加减号

满分代码

class AppleTree:
    tree_name = 0
    apples_num = 0
    cut_sum = 0

    def __init__(self, original_apples_num, tree_name):
        # 初始化一个苹果树对象时传入原有苹果个数和编号(注意:从1开始)
        self.apples_num = original_apples_num
        self.tree_name = tree_name

    def cut_apples(self, cut_num):
        self.apples_num += cut_num
        # 苹果数减少,因为传入cutnum为非正数
        self.cut_sum -= cut_num
        # 总的被修剪的个数增加


if __name__ == "__main__":
    tree_num, cut_round = input().split(" ")
    tree_num = int(tree_num)
    cut_round = int(cut_round)

    tree_objects = []
    # 苹果树对象列表

    for tn in range(tree_num):
        tree_objects.append(AppleTree(0, tn + 1))
        # 以苹果数为0,传入名字为tn + 1初始化一个苹果树对象并添加至列表

        original_apples_num, cut_num_list = input().split(" ", 1)
        # 先只分一次把原始苹果数和多次修剪的个数分开
        original_apples_num = int(original_apples_num)
        # 得到每棵树的原始苹果数

        cut_num_list = list(map(int, cut_num_list.split(" ")))
        # 然后再把修剪个数分开并分别转为int型

        tree_objects[tn].apples_num = original_apples_num
        # 修改苹果树对象的初始苹果数

        for cut_num in cut_num_list:
            # 修剪一棵树cut_round轮,即cut_num_list的长度
            tree_objects[tn].cut_apples(cut_num)

    all_apples_count = 0
    for to in tree_objects:
        all_apples_count += to.apples_num
    # 计算所有苹果树的苹果总数

    tree_objects.sort(key=lambda i: i.cut_sum, reverse=True)
    # lambda的优雅用法:对对象数组、字典等根据某一特定项大小进行逆序稳定排序

    print(all_apples_count, tree_objects[0].tree_name, tree_objects[0].cut_sum)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值