每日一练-i,j序列
python例题:给你一个长度为n的序列,请输出满足以下条件的(i,j)的数量
📆Date: 2023年1月5日
🎬Author: 小 y 同 学
📃Classify: 蓝桥杯每日一练
🔖Language: Python
🍀题目描述
题意
给你一个长度为n的序列,请输出满足以下条件的 ( i , j ) (i,j) (i,j)的数量
① 1 ≤ i ≤ j ≤ n ② min ( a i , a j ) = i ③ max ( a i , a j ) = j ①1\le i \le j \le n\quad ②\min (a_i,a_j)=i\quad ③\max(a_i,a_j)=j ①1≤i≤j≤n②min(ai,aj)=i③max(ai,aj)=j输入格式
第一行一个正整数 n ( 2 ≤ n ≤ 5 × 1 0 5 ) n\ (2\le n \le 5 \times 10^5) n (2≤n≤5×105)
第二行包含n个正整数 a i ( 1 ≤ a i ≤ n ) a_i \ (1\le a_i \le n) ai (1≤ai≤n)输出格式
一个正整数表示答案样例输入1
4 1 3 2 4
- 样例输出1
2
- 样例输入2
10 5 8 2 2 1 6 7 2 9 10
- 样例输出2
8
🌿解题思路
- 题目梳理
首先我们需要明白的是 ( i , j ) (i,j) (i,j)要同时满足题目所说的三个条件才可以满足样例;知道一点以后我们可以在满足条件 ① 1 ≤ i ≤ j ≤ n ①1\le i \le j \le n ①1≤i≤j≤n的情况下讨论同时满足条件 ② min ( a i , a j ) = i ③ max ( a i , a j ) = j ②\min (a_i,a_j)=i③\max(a_i,a_j)=j ②min(ai,aj)=i③max(ai,aj)=j的情况,无非两种: ① a i = i , a j = j ①a_i=i,a_j=j ①ai=i,aj=j或者 ② a i = j , a j = i ②a_i=j,a_j=i ②ai=j,aj=i我们可以分别计算这两种情况的数量相加即可得到结果。- 数据输入
n的输入很简单,注意转为int类型方便计算即可;对ai的存储小y是先将数据num_li = list(map(int, input().split()))
存入num_li列表中,再在列表的最前端插入一个0元素,因为列表下标是从0开始的,而i的计算是从1开始的,这里为了减少不必要的以外麻烦,就采取这种数据的整理模式。- 核心处理
对于上述第二种情况的处理非常简单判断此条件i == num_li[tem] and i < tem
是否成立即可:这里的tem指的是ai的值同时也是满足条件对应j的值,那么num_li[tem]就对应的aj,同时应该注意满足条件 ① 1 ≤ i ≤ j ≤ n ①1\le i \le j \le n ①1≤i≤j≤n
对于上述第一种情况则较为复杂,我们可以这么思考:如果ai=i满足,那么与之配对的只有aj=j,我们可以将所有的类似ak=k的元素都作一个计数x_1;如果最终x_1==5,这里就举一个简单的例子1 2 3 4 5
我们可以列举所有的满足情况①的情况:1 2
,1 3
,1 4
,1 5
,2 3
,2 4
,2 5
,3 4
,3 5
,4 5
,我们可以找到满足条件①的最终数量 s 1 = ( x _ 1 − 1 ) + . . . + 3 + 2 + 1 s1=(x\_1-1)+...+3+2+1 s1=(x_1−1)+...+3+2+1也就是前 x _ 1 − 1 x\_1-1 x_1−1的和,用前n项和公式 S = ( 1 + n ) × n 2 S=\frac{(1+n)\times n}{2} S=2(1+n)×n计算即可,这里注意 n = x _ 1 − 1 n=x\_1-1 n=x_1−1。
🌸Python源码
# _*_coding:utf-8_*_ # created by cy on 2023/1/5 def solve(): n = int(input()) num_li = list(map(int, input().split())) num_li.insert(0, 0) # 列表的第一项插入0,使下标与i的值对应,注意列表长度n+1 x_1 = 0 # 间接记录第一种情况 x2 = 0 # 记录第二种情况 for i in range(1, n + 1): tem = num_li[i] if tem == i: # ai=i,aj=j间接的情况 x_1 += 1 elif i == num_li[tem] and i < tem: # aj=i,ai=j的情况 x2 += 1 s = x2 + x_1 * (x_1 - 1) / 2 print(int(s)) if __name__ == "__main__": solve()
📧Summary
小y的今日一练到此画上了句号,欢迎友友们多给建议🌼🌼🌼
有兴趣一起学习编程的小伙伴可以私聊小y一起学习,小y在Python,c/c++和matlab语言上均有一定的基础😜😜😜

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)