题目
Sample Input
5
20 30 10 50 40
4
200 100 100 200
Sample Output
4
2
思路
尝试直接暴力,先统计每个数的量,然后从大到小,如果大的数后面可以跟小的数就跟,ans++统计
AC代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x)
typedef long long ll;
const int maxn = 1e3+10;
#define PI acos(-1)
int a[maxn];
int main()
{
int n,x,maxx,ans;
while(~scanf("%d",&n))
{
ans = 0;
maxx = -1;
m(a);
//读入数据并统计每个数的量
rep(i, 0, n-1){
scanf("%d",&x);
a[x]++;
maxx = max(maxx,x);
}
int i = maxx;
//循环一直到i=0为止
while(i)
{
//这里是在找有读入进去的数
while(!a[i]&&i>0)i--;
a[i]--;
//在i数之前如果有存在数则将其放在i数之前,同时ans+1,这个数被消耗掉
for(int j=i-1;j>0;j--)
{
if(a[j])
{
a[j]--;
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}