这题其实就是利用了贪心的思想,用更大的数尽量多的抵消掉一些小的数,让后面更大的数留下来,因为原序列可能有更大的数需要抵消,所以不能浪费后一个序列中的大的数,这是贪心的思想,也是对后来的取值有影响。
参考博客:
https://blog.csdn.net/jay__bryant/article/details/81413442
朴素模拟代码:
//D
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define MAXN 100010
int Data[MAXN];
vector<int>V;
int Bin_Search(int x)
{
int l,r,mid;
l=0;
r=V.size()-1;
while(l<=r)
{
mid=(l+r)/2;
if(V[mid]<=x)
l=mid+1;
else
r=mid-1;
}
return l;
}
int main()
{
int i;
int n;
int cnt,pos;
while(scanf("%d",&n)!=EOF)
{
memset(Data,0,sizeof(Data));
for(i=1;i<=n;i++)
scanf("%d",&Data[i]);
sort(Data+1,Data+1+n);
V.clear();
for(i=1;i<=n;i++)
V.push_back(Data[i]);
cnt=0;
for(i=1;i<=n;i++)
{
if(V[V.size()-1]<=Data[i])
break;
pos=Bin_Search(Data[i]);
cnt++;
V.erase(pos+V.begin());
}
printf("%d\n",cnt);
}
return 0;
}
也可以加一些剪枝: