先从大到小排序,然后用一个vis标记这个数有没有用过,找到第一个没有用过的最小的,然后往后扫尽可能多的连续的递增的数,反复这样做,直到所有的数都遍历一遍
需要注意的是有可能有重复的数字
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
int a[1005];
bool vis[1005];
int main()
{
int n;
memset(vis, false, sizeof(vis));
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
//升序排列
sort(a, a + n);
int cou = 0, ans = 0;
while (cou != n) {
int i;
//找到第一个没有用过的最小的数a[i]
for (i = 0; i < n; i++) {
if (!vis[i]) {
vis[i] = true;
cou++;
break;
}
}
//从a[i + 1]开始找尽可能长的递增的数列
for (int j = i + 1; j < n; j++) {
if (!vis[j] && a[j] > a[i]) {
vis[j] = true;
cou++;
ans++;
i = j; // 记得改变i
}
}
}
printf("%d\n", ans);
return 0;
}