You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Codeforces 1712C题解逻辑漏洞排查:数组排序最小操作数

题目:最少操作次数使数组非递减

给定一个由n个正整数a₁,a₂,…,aₙ组成的数组。

一次操作定义如下:选择任意整数x,将所有等于x的数组元素赋值为0。

求将数组排序为非递减顺序所需的最少操作次数。

输入格式

  • 每组测试包含多组用例,第一行输入测试用例数t(1≤t≤10⁴)。
  • 每个测试用例第一行输入整数n(1≤n≤10⁵)。
  • 第二行输入n个正整数a₁,a₂,…,aₙ(1≤aᵢ≤n)。
  • 保证所有测试用例的n之和不超过10⁵。

输出格式

每个测试用例输出一个整数,即所需的最少操作次数。

示例

输入示例

5
3
3 3 2
4
1 3 1 3
5
4 1 5 3 2
4
2 4 1 2
1
1

输出示例

1
2
4
3
0

说明

  • 第一个测试用例中,选择x=3进行操作,得到数组[0,0,2]。
  • 第二个测试用例中,先选x=1,再选x=3操作,得到数组[0,0,0,0]。
问题求助

我的提交解法在隐藏测试用例中失败,请求指出逻辑漏洞或遗漏的边界情况。

我的逻辑思路

  • 若数组非递减、长度为1或仅含一种元素,返回0;
  • 若最后一个元素重复出现,返回数组中不同元素的数量;
  • 若最后一个元素不重复,且倒数第二个元素小于最后一个元素,递归处理去掉最后一个元素的子数组;
  • 若最后一个元素不重复,且倒数第二个元素≥最后一个元素,返回去掉最后一个元素的子数组中不同元素的数量。

我的代码

def distinct(arr):
    return len(set(arr))

def increase(arr):
    for i in range(len(arr)-1):
        if arr[i]>arr[i+1]:
            return False
    return True
    
def fun(arr,n):
    last_element=arr[-1]
    if (increase(arr)==True or len(arr)==1 or distinct(arr)==1):
        return 0
    elif (n-1 != (arr.index(last_element))):
        return distinct(arr)
    else:
        if arr[-2]<last_element:
            return fun(arr[:-1],n-1)
        else:
            return distinct(arr[:-1])

t=int(input())
while t>0:
    t=t-1
    n=int(input())
    arr=[int(x) for x in input().split()]
    print(fun(arr,n))

内容的提问来源于stack exchange,提问作者Gargee Suresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:45:47