第八届“图灵杯”NEUQ-ACM程序设计竞赛 - 上进的凡凡

该博客介绍了一个编程问题,涉及数组处理和算法。题目要求计算给定数组的所有非降序子数组的数量。博主提供了使用递增计数和递减计数策略的解决方案,并利用等差数列求和公式来得出结果。该问题主要考察数组操作和条件判断的编程技巧。

链接:https://ac.nowcoder.com/acm/contest/12636/C
来源:牛客网

题目描述
凡凡是一个上进的人,他的人生没有下坡路,他也讨厌带有”下坡路“的东西。

所以,对于凡凡来说,只有非降序的数组才是nice的(如:1,2,2,3,4,5,5);若数组元素个数为1,也满足非降序,也是nice的。

现在有一个长度为n的数组,凡凡想知道它的子数组中有多少个数组是nice的。

你能帮帮他吗?

对于子数组的定义,如果可以通过从开头和从结束分别删除若干个(可以为零或全部,前后删除个数不必相同)元素来从数组b获得数组a,则称数组a是数组b的子数组。(子数组包含原数组,但不包含空串)

输入描述:
第一行输入一个整数n(1≤n≤10^5),表示数组的长度。

第二行包含n个空格分隔的整数a1,a2,.,an(0≤ai≤10^9),为数组的元素。

输出描述:
输出给定数组的子数组中是nice数组的个数。(注意使用long long)


思路:
递增计数
递减结算,同时计数回归1
用到了等差数列求和公式 n(n+1)//2
不断累积次数最后输出

total_times = int(input())
arr = list(map(int, input().split()))
times = 1
for index, num in enumerate(arr):
    if index != 0:
        if num < arr[index - 1]:  # decreasing
            total_times += times * (times - 1) // 2
            times = 1
        else:  # increasing
            times += 1
total_times += times * (times - 1) // 2
print(total_times)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值