蓝桥杯-每日一练04

题目描述

小明是个鹅卵石收藏者,从小到大他一共收藏了 nn 块鹅卵石,编号分别为 1∼n1∼n,价值分别为 a1,a2,⋯ ,ana1,a2,⋯,an。

这天他乘船准备去往蓝桥王国,然而天有不测风云,小明所在的海域下起了暴雨。

很快小明船上的积水越来越多,为了防止沉船,小明不得不选择若干块他收藏的鹅卵石丢弃。

小明制定了一套名为m计划的选择方案,其内容如下:

  • 对于任意区间 [i,i+m−1][i,i+m−1]丢弃价值最小的鹅卵石i∈[1,n−m+1]i∈[1,n−m+1]。

  • 对于一块鹅卵石,它在 mm 计划中是可以被丢弃多次的。

请你输出将被小明丢弃的鹅卵石的价值。

输入描述

输入第 11 行包含两个正整数 n,mn,m。

接下来一行包含 nn 个正整 a1,a2,⋯ ,ana1,a2,⋯,an,表示鹅卵石的价值。

1≤m≤n≤5×1051≤m≤n≤5×105,0≤ai≤1090≤ai≤109。

输出描述

输出共 n−m+1n−m+1 行,每行输出一个整数,第 ii 行输出整数的含义为 ai,ai+1,⋯ ,ai+m−1ai,ai+1,⋯,ai+m−1 的最小值。

输入输出样例

代码显示

import os
import sys
# 请在此输入您的代码
#m计划 ,最小堆,
#heapq有两种方式创建堆, 
#一种是使用一个空列表,然后使用heapq.heappush()函数把值加入堆中,
#另外一种就是使用heap.heapify(list)转换列表成为堆结构
import heapq
n,m = map(int,input().split())
alist = list(map(int,input().split()))
q = [(alist[i],i) for i in range(m)]
heapq.heapify(q)
print(q[0][0])
for i in range(m,n):
    heapq.heappush(q,(alist[i],i))
    while q[0][1]<=i-m:
        heapq.heappop(q)
    print(q[0][0])

题目描述

蓝桥幼儿园的学生是如此的天真无邪,以至于对他们来说,朋友的朋友就是自己的朋友。

小明是蓝桥幼儿园的老师,这天他决定为学生们举办一个交友活动,活动规则如下:

小明会用红绳连接两名学生,被连中的两个学生将成为朋友。

小明想让所有学生都互相成为朋友,但是蓝桥幼儿园的学生实在太多了,他无法用肉眼判断某两个学生是否为朋友。于是他起来了作为编程大师的你,请你帮忙写程序判断某两个学生是否为朋友(默认自己和自己也是朋友)。

输入描述

第 11 行包含两个正整数 N,MN,M,其中 NN 表示蓝桥幼儿园的学生数量,学生的编号分别为 1∼N1∼N。

之后的第 2∼M+12∼M+1 行每行输入三个整数,op,x,yop,x,y:

  • 如果 op=1op=1,表示小明用红绳连接了学生 xx 和学生 yy 。

  • 如果 op=2op=2,请你回答小明学生 xx 和 学生 yy 是否为朋友。

1≤N,M≤2×1051≤N,M≤2×105,1≤x,y≤N1≤x,y≤N。

输出描述

对于每个 op=2op=2 的输入,如果 xx 和 yy 是朋友,则输出一行 YES,否则输出一行 NO。

输入输出样例

import os
import sys

# 请在此输入您的代码
N,M=map(int,input().split())
s=[]
for _ in range(M):
  op,x,y=map(int,input().split())
  if op==1:
    s.append(x)
    s.append(y)
  elif op==2:
    if len(s)!=0:
      print('YES')
    else:
      print('NO')    

题目描述

给定一个长度为 NN 数组 aa 和一个长度为 MM 的数组 bb。

请你求出它们的最长公共子序列长度为多少。

输入描述

输入第一行包含两个整数 N,MN,M,分别表示数组 aa 和 bb 的长度。

第二行包含 NN 个整数 a1,a2,...,ana1,a2,...,an。

第三行包含 MM 个整数 b1,b2,...,bnb1,b2,...,bn。

1≤N,M≤1031≤N,M≤103,1≤ai,bi≤1091≤ai,bi≤109。

输出描述

输出一行整数表示答案。

输入输出样例

代码显示

#最长公共子序列
n,m=map(int,input().split())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
dp = [[0]*(n+1) for _ in range(m+1)]
for i in range(1,m+1):
    for j in range(1,n+1):
        if a[j-1]==b[i-1]:
            dp[i][j]=dp[i-1][j-1]+1
        else:
            dp[i][j]=max(dp[i-1][j],dp[i][j-1])
print(dp[-1][-1])

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值