题目链接
题目大意
有n个元素,每个元素的存储空间为k=log2(h),h是这n个元素不同的种类,让你求出一个l,r让你把这些元素都控制在l,r里面,使得n个元素的储存空间小于I,求最小的改动元素个数。
解题思路
先按照题意把h求出来,然后尺取维护l,r把最后的结果求出来
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
const int N=4e5+5;
int a[N];
map<int,int>ma;
int main()
{
int n,k;
scanf("%d %d",&n,&k);
k*=8;
k/=n;
if(k>=30)
k=30;
k=1<<k;
//printf("%d\n",k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
int ans=n-1;
int l=1,r=1,cnt=1,num=1;
ma[a[1]]++;
while(r<n)
{
r++;
if(!ma[a[r]]++)
cnt++;
num++;
while(cnt>k)
{
if(!--ma[a[l]])
cnt--;
num--;
l++;
}
ans=min(ans,n-num);
}
printf("%d\n",ans);
return 0;
}