怎样更加简洁的解决小明种苹果(续)(ccf201909-2)

这道题需要我们解决三个小问题:

1、输出全部操作结束后,所有苹果树上苹果剩余的个数;
2、发生苹果掉落的苹果个数;
3、相邻三颗苹果树发生苹果掉落情况的组数

最有意思的是第3个小问,按照我的理解,这些苹果树是一列的,只需要把每颗苹果树是否掉落苹果的状态存入列表中,再统计出列表中连续出现三个1的次数即可。但题目中的这N颗苹果树排成了一个圆,这里的相邻,需要考虑列表的头和尾。
总结一下大家的做法,大致有三种:

①当超过三棵树时通过对列表索引求余解决
②再一个是把列表的前两个元素添加到列表的末尾解决
③最后一个相对复杂,每一次遍历都要考虑列表的头和尾的情况,通过赋值来改变索引。

感觉以上方式过于复杂,因此,我分享出我的代码:

for i in range(len(l)):
    if l[i-2] and l[i-1] and l[i]:
        e += 1

改变一下索引,直接从列表的最后两个元素开始读取,全是1的情况e就自加1。这个方法看起来似乎简便些。

同时也分享一下上述三种情况的代码,大家可自取所需:

if N >= 3:  # 苹果树少于三棵时  直接为0
    for y in range(len(is_fall)):
        if is_fall[y%len(is_fall)] == is_fall[(y+1)%len(is_fall)] == is_fall[(y+2)%len(is_fall)] == 1:
            E += 1
else:
	E = 0

res_drop.append(res_drop[0])
res_drop.append(res_drop[1])
for i in range(N):
    if res_drop[i] == 1 and res_drop[i+1] == 1 and res_drop[i+2] == 1:
        num += 1
print(' '.join([str(res),str(count_drop),str(num)]))

for i in range(len(is_fall)):
    pre=i-1
    if pre<0:
        pre+=len(is_fall)
    next=i+1
    if next > len(is_fall)-1:
        next-=len(is_fall)
    if is_fall[pre]==is_fall[i]==is_fall[next]==1:
        E+=1

以下是我对这题的解法:

n = int(input())
result = 0 # 总共剩余的苹果
count = 0
e = 0 # 连续三颗树的掉落情况
dl = 0 # 掉落的苹果棵树
l = [0] * n # n颗苹果树是否有苹果掉落的情况
for i in range(n):
    fs = []
    zs = []
    s = total = 0
    x = list(map(int,input().split()))
    x = x[::-1]
    caozuo = x.pop()
    #判断剩余的苹果个数
    for j in range(caozuo):
        s = x[j]
        if s <= 0:
            fs.append(s)
            #print(fs)
        else:
            zs.append(s)
            break

    result += sum(fs) + zs[0]

    total = x.pop()
    ss = 0
    for j in range(len(x)):
        flag = z = 0
        s = x.pop()
        if s < 0:
            ss = ss + s
        elif s == 0:
            continue
        else:
            z = s
            total = total + ss
            if total > z:
                flag = 1
            else:
                flag = 0
        l[i] = flag
        if flag == 1:
            dl += 1
            break
        else:
            continue
            
for i in range(len(l)):
    if l[i-2] and l[i-1] and l[i]:
        e += 1
print(result,dl,e)

第1 小问的思路是对列表进行反转,遍历列表,遇到复数相加,遇到正数停止,并用该正数加上前面的复数和,循环得到所有树上的苹果数。
第2小问的思路是利用栈,对弹出列表中的元素求和,遇到正数停止并比较其大小来判断是否发生掉落。

关于引用:

https://blog.csdn.net/SIMPLE1995/article/details/103252036
https://www.pythonf.cn/read/158855

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值