思路:思维题。由于每个数可能出现多次,所以说先用hash表统计一下,然后排序贪心地算可以免费删除的最大次数,具体流程如下:先定义一个
变量表示上一个元素是多少,初始化为-1,因为题目说了输入数据
,这样初始化能保证他不会和第一个数连续
再定义一个变量表示上一个元素出现的次数,然后遍历hash表判断是否连续。如果连续的话,免费的删除次数就是
,累加到
中。然后更新
和
,这里需要注意一下,由于我们可以形成的连续链长度>= 2,所以说
应该更新为当前元素的出现次数c,他不仅可以被上一个元素作用,也可以作用于接下来的元素。如果碰到不连续的了,那么直接令
表示不会产生免费删除次数
最后清空整个数组的最小操作代价就是n - sub,直接输出结果即可
代码:
import sys
from collections import Counter
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def GMI():
return map(lambda x: int(x) - 1, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n = II()
a = LII()
cnt = Counter(a)
sub = 0
pre_val = -1
pre_cnt = 0
for val, c in sorted(cnt.items()):
if val != pre_val + 1:
pre_cnt = 0
sub += fmin(pre_cnt, c)
pre_val = val
pre_cnt = c
print(n - sub)
t = 1
# t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号