#牛客在线求职答疑中心#小欧有一个长度为n的数组{a1,a2,….,an},他可以进行任意次操作:
•选择1≤i,j≤n,i≠j,执行ai=ai+1同时aj=aj-1。(前提是aj>1,也就是说操作后数组的所有元素都必须还是正整数。)

他想从数组中选择一个子序列,使得子序列是一个排列,请问在可以进行任意次上述操作的前提下,这个“排列子序列”的长度最长是多少?

定义子序列为从原数组中删除任意数量(可以为零、可以为全部)的元素所得到的新数组。

长度为n的排列是由1~n这n个整数、按任意顺序组成的数组,每个整数恰好出现一次。例如,{2,3,1,5,4}是一个排列,但{1,2,2}不是一个排列(数组中的2出现了两次),{1,3,4}也不是一个排列(长度为3但数组中有4)。
|输入描述
第一行输入一个正整数n(1≤n≤10^5)代表数组中的元素数量。
第二行输入n个正整数a1,a2,...,an(1≤ai≤10^5)代表数组元素。
| 输出描述
在一行上输出一个整数,代表最长的“排列子序列”长度。

说明
可以选择i=3,j=4,操作两次,数组a变为[1,2,7,3],可以选
择的最长排列子序列为[1,2,3],长度为3。

示例:
输入:
4
1 2 5 5
输出:
3

用python编程
全部评论
未优化写作的题解: 设取k个数,集合为A (A的大小为k),要构成1~k。剩下n-k个数够成集合B 设这k个数的和为sum, 若sum>=1+...+k,显然可行(内部匀,多了丢给B) 若sum<1+...+k,需要从B借,而B内每个数ai能提供ai-1(ai最后不小于1) 如此一看,不如选A的时候就选最大的k个数。 -------------------- 可二分答案, check k=mid是否可行: 取最大的k个数,若sum大于1+...+k,true,若sum不够,看剩下要借的,B能不能提供
点赞 回复 分享
发布于 2025-04-12 17:24 广东

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务