CCF201604-1 折点计数 (python语言)

本文详细解析了一道关于折点计数的经典算法题目,通过分析销售量的变化趋势,找出销售趋势转折点的数量。文章提供了完整的算法思路和Python实现代码,帮助读者理解和掌握折点计数的计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

试题编号:201604-1
试题名称:折点计数
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  给定n个整数表示一个商店连续n天的销售量。如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点。其他的天都不是折点。如下图中,第3天和第6天是折点。

  给定n个整数a1, a2, …, an表示销售量,请计算出这些天总共有多少个折点。
  为了减少歧义,我们给定的数据保证:在这n天中相邻两天的销售量总是不同的,即ai-1≠ai。注意,如果两天不相邻,销售量可能相同。

输入格式

  输入的第一行包含一个整数n
  第二行包含n个整数,用空格分隔,分别表示a1, a2, …, an

输出格式

  输出一个整数,表示折点出现的数量。

样例输入

7
5 4 1 2 3 6 4

样例输出

2

评测用例规模与约定

  所有评测用例满足:1 ≤ n ≤ 1000,每天的销售量是不超过10000的非负整数。

 

问题链接:CCF201604-1 折点计数

问题分析

根据题意可得:折点即为两边都比他大或者两边都比他小的点,同时第一个点和最后一个点不是折点。

满分代码

n=int(input())
a=input().split()
for i in range(n):
    a[i]=int(a[i])
#记录折点数量
count=0
#只有一个或两个点的话,没有折点
if n==1 or n==2:
    print(0)
else:
    for i in range(1,n-1):
        #比两边都大或者比两边都小
        if (a[i]>a[i-1] and a[i]>a[i+1])or(a[i]<a[i-1] and a[i]<a[i+1]):
            count+=1
    print(count)

 

### CCF CSP 历年 Python 真题及答案解析 #### 背景介绍 CCF-CSP(中国计算机职业资格认证)是一项针对程序员实际编程能力的测试。随着Python语言的普及,越来越多的CSP题目支持使用Python作为解题工具。通过练习这些真题,考生能够更好地理解算法设计、数据结构以及程序优化的重要性。 以下是部分典型的CCF CSP历年Python真题及其解答: --- #### 题目 1:分蛋糕 (201703-1) ##### 描述 给定一块长度为 `n` 的蛋糕数组,每一段蛋糕有一个大小值。现在需要将这块蛋糕分成若干段,使得每一小段的总和至少达到指定阈值 `k`。求最多能切出多少段满足条件的小蛋糕。 ##### 输入格式 两个整数 `n`, `k` 表示蛋糕数量和最小阈值;接着输入一行表示每块蛋糕的大小。 ##### 输出格式 输出一个整数,表示最大可分割的数量。 ##### 解法思路 采用贪心策略解决此问题。遍历整个蛋糕列表,在累积到大于等于 `k` 的时候计数一次并重置累加器。 ##### 参考代码 ```python n, k = map(int, input().split()) cake = list(map(int, input().split())) cnt = 0 s = 0 for i in range(n): s += cake[i] if s >= k: cnt += 1 s = 0 # Reset sum after cutting a piece of cake print(cnt) ``` 上述实现基于引用中的逻辑[^2]进行了简化与改进,确保其更加清晰易懂。 --- #### 题目 2:字符串匹配 (假设来自某次考试) ##### 描述 给出两个字符串 A 和 B,判断是否存在一种方式可以通过删除某些字符使两者相等。如果存在,则返回 True;否则返回 False。 ##### 输入格式 两行分别代表字符串A和B。 ##### 输出格式 布尔值True或False。 ##### 解法思路 利用动态规划方法来解决问题。定义状态转移方程 dp[i][j] 表明前i个字符组成的子串能否变成另一个由前j个字符构成的目标字串。 ##### 参考代码 ```python def can_transform(A: str, B: str) -> bool: m, n = len(A), len(B) dp = [[False]*(n+1) for _ in range(m+1)] dp[0][0] = True for i in range(1,m+1): dp[i][0]=dp[i-1][0] for j in range(1,n+1): dp[0][j]=False for i in range(1,m+1): for j in range(1,n+1): if A[i-1]==B[j-1]: dp[i][j]=dp[i-1][j-1] else: dp[i][j]=dp[i-1][j] return dp[m][n] # Example Input/Output Handling A=input() B=input() if(can_transform(A,B)): print(True) else: print(False) ``` 该解决方案未直接来源于任何具体引用材料,而是依据常见字符串处理技巧构建而成。 --- #### 题目 3:矩阵路径计算 (假想实例) ##### 描述 在一个二维网格上移动,从左上角走到右下角,每次只能向右或者向下走一步。问有多少种不同的行走路线? ##### 输入格式 单个正整数值N,表示网格边长(N*N)。 ##### 输出格式 总的可能路径数目。 ##### 解法思路 这是一个经典的组合数学问题,可以用排列组合公式直接得出结果。即C_{2N}^{N}= \frac{(2N)!}{(N!)^2} ##### 实现代码 ```python from math import factorial as fac def count_paths(N:int)->int: return fac(2 * N)//fac(N)**2 N=int(input()) print(count_paths(N)) ``` 以上例子展示了如何运用基本数学原理快速得到结论而无需复杂迭代过程。 --- ### 总结说明 本文提供了几个典型CCF CSP竞赛中涉及Python语言的实际案例分析,并给出了相应源码片段供学习者参考实践。更多深入内容建议查阅专门整理资料集锦如《CCF-CSP历年真题大全》[^1]获取全面覆盖范围内的训练素材。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值