题目大意:
给定集合
A
,对于任意一个
很明显每次搞出一个长度为
cnt
的最长上升序列,然后把元素给删掉,答案增加
cnt−1
。
直接暴力需要
O(n2)
。
但是可以进行优化。
设有
ai
个
i
,将个数从小到大排序,记为长度为
则答案为
res=∑li=1(bi−bi−1)∗(l−i)=∑li=1bi∗(l−i)−∑li=1bi∗(l−i−1)+bl=∑li=1bi+bl=n−bl
于是可以优化到
O(n)
。
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int T=1001;
int n;
int a[T],len;
inline int read(void)
{
int x=0; char c=getchar();
for (;!isdigit(c);c=getchar());
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x;
}
int main(void)
{
n=read();
for (int i=1;i<=n;i++) a[read()]++;
printf("%d\n",n-*max_element(a,a+T));
return 0;
}