题目
思路:用map来存每个数字的个数,再用一个数组将这些个数都存起来
然后遍历
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const LL maxn = 1e6+5;
int cnt[maxn];
map<int, int> m;
int main()
{
int n,I,x;
cin >> n >> I;
if(I*8/n >= ceil(log2(n)))
cout << 0 << endl; //直接可以放下当前n个数, 剪枝
else
{
int k = pow(2,(I*8/n)); //可以容纳不同数的个数
for(int i = 1; i <= n; ++i)
{
cin >> x;
m[x]++;
}
int len = 0, ans = 0, sum = 0;
for(auto it : m)
cnt[len++] = it.second;
for(int i = 0; i < k; ++i)
sum += cnt[i], ans = sum;
for(int i = k; i < len; ++i)
{
sum += cnt[i];
sum -= cnt[i-k];
ans = max(ans, sum);
}
cout << n - ans << endl;
}
return 0;
}