近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。一个月后,有M棵胡杨未能成活。现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?
输入描述
N 总种植数量
M 未成活胡杨数量
M 个空格分隔的数,按编号从小到大排列
K 最多可以补种的数量
其中:
1 <= N <= 100000
1 <= M <= N
0 <= K <= M
输出描述
最多的连续胡杨棵树
示例1 输入输出 示例仅供调试,后台判题数据一般不包含示例
输入
5
2
2 4
1
输出
3
说明
补种到2或4结果一样,最多的连续胡杨棵树都是3。
示例2
输入
10
3
2 4 7
1
输出
6
说明
补种第7棵树,最多的连续胡杨棵树为6(5,6,7,8,9,10)
# 补种未成活胡杨 : 数组中元素的索引队列 + 滑动窗口# 根据窗口中 0 的个数是否大于 k 个滑动 l 的位置
n =int(input())
m =int(input())
death =sorted(list(map(int,input().split(" "))))
k =int(input())trees =[-1]+[1]* n
for i in death:trees[i]=0l, r, zero_pos, zero_cnt, one_cnt, ans =1,1,[],0,0,0while r < n +1:if trees[r]==0:zero_pos.append(r)zero_cnt +=1else:one_cnt +=1if zero_cnt > k:first_zero = zero_pos.pop(0)one_cnt -=sum(trees[l:first_zero])l = first_zero +1zero_cnt -=1# 窗口中存在的满足 k 条件的 zero_cnt 个数是可以变为 1 的ans =max(ans, one_cnt + zero_cnt)r +=1print(ans)
# 最少交换次数 : 滑动窗口# 1. 将数组中所有满足小于 K 条件的数字都看做 1, 不满足的看做 0# 2. 要将窗口大小维持为数组中的所有 1 的个数 m, 利益最大化# 3. 窗口中 0 的个数即为当前答案(所要交换的次数)# 当窗口长度为整个数组中数字满足小于 K 的个数 m 时, 滑动 l 的位置# 更新答案为 min 当前 m 长度的窗口 - 窗口中所有小于 K 的数字的个数
nums =list(map(int,input().split()))
k =int(input())arr =[1if i < k else0for i in nums]
m =sum(arr)if m ==0:print(0)exit()n =len(arr)
l, r, ans =0,0,float("inf")while r < n:if r - l +1== m:ans =min(ans, m -sum(arr[l:r+1]))l +=1r +=1print(ans)
# 类似题目# 交换定义为选中一个数组中的两个互不相同的位置并交换二者的值。# 环形数组是一个数组, 可以认为第一个元素和最后一个元素相邻。# 给你一个二进制环形数组 nums, 返回在任意位置将数组中的所有 1 聚集在一起需要的最少交换次数。# https://leetcode.cn/problems/minimum-swaps-to-group-all-1s-together-ii/description/classSolution:defminSwaps(self, nums: List[int])->int:n =len(nums)m =sum(nums)if m ==0:return0arr =[*nums]for i in nums:arr.append(i)l, r, one_cnts, ans =0,0,0,float("inf")while l < n:if arr[r]:one_cnts +=1if r - l +1== m:ans =min(ans, m - one_cnts)if arr[l]:one_cnts -=1l +=1r +=1return ans if ans !=float("inf")else0
# 宽度最小的子矩阵 : 负债模型 + 滑动窗口
n, m =list(map(int,input().split(" ")))
nums =[]for i inrange(n):nums.append(list(map(int,input().split(" "))))
k =int(input())
target =list(map(int,input().split(" ")))MAXNUM =1001
cnt =[0]* MAXNUM
for i in target:cnt[i]-=1l, r, debt, width =0,0, k,float("inf")while r < m:for i inrange(n):if cnt[nums[i][r]]<0:debt -=1cnt[nums[i][r]]+=1if debt ==0:count =sum([1if cnt[nums[i][l]]>0else0for i inrange(n)])while count == n:count =sum([1if cnt[nums[i][l]]>0else0for i inrange(n)])if count == n:judge_all_duplicate =Falsefor i inrange(n):cnt[nums[i][l]]-=1for i in cnt:if i <0:judge_all_duplicate =Truebreakif judge_all_duplicate:for i inrange(n):cnt[nums[i][l]]+=1breakelse:l +=1width =min(width, r - l +1)r +=1print(width if width !=float("inf")else-1)
一个 DNA 序列由 A/C/G/T 四个字母的 排列组合 组成。 G 和 C 的比例(定义为 GC-Ratio )是序列中 G 和 C 两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的 GC-Ratio 可能是基因的起始点。给定一个很长的 DNA 序列,以及限定的子串长度 N ,请帮助研究人员在给出的 DNA 序列中从左往右找出 GC-Ratio 最高且长度为 N 的第一个子串。
DNA序列为 ACGT 的子串有: ACG , CG , CGT 等等,但是没有 AGT , CT 等等(这行内容毫无关系?)
数据范围: 字符串长度 满足 1≤n≤1000,输入的字符串只包含 A/C/G/T 字母
输入描述:
输入一个string型基因序列,和int型子串的长度
输出描述:
找出GC比例最高的子串,如果有多个则输出第一个的子串
示例1:
输入
ACGT
2
输出
CG
说明
ACGT长度为2的子串有AC,CG,GT3个,其中AC和GT2个的GC-Ratio都为0.5,CG为1,故输出CG
示例2:
输入
AACTGTGCACGACCTGA
5
输出
GCACG
说明
虽然CGACC的GC-Ratio也是最高,但它是从左往右找到的GC-Ratio最高的第2个子串,所以只能输出GCACG。
# DNA序列 : 滑动窗口
s =input().strip()
k =int(input().strip())n =len(s)
l, r, max_ratio, start =0,0,float("-inf"),0while r < n:if r - l +1== k:cur = s[l:r+1]ratio =(cur.count("C")+ cur.count("G"))/len(cur)if ratio > max_ratio:max_ratio = ratiostart = ll +=1r +=1print(s[start:start+k]if max_ratio !=float("-inf")else"")