第一行给出t,接着有t个问题,ai表示第i个问题的种类。现在想要举办比赛,每天一场比赛,每场比赛所有问题都是一个种类,第二天的问题数是前一天问题数的两倍,问最多的问题数
首先我们用mp来记录每个种类数,用a数组来记录种类数的问题数量。接着对a排序,然后就开始搜索过程。首先就是想到暴力,但是暴力会超时,于是改用stl自带的二分查找,就A了
#include<iostream>
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
const int N = 1e6+10;
int a[N] , b[N] , c[N] , d[N];
map<int,int>mp;
int main()
{
int t;
cin >> t;
int cnt = 0;
int x;
for(int i = 1 ; i <= t ; i++)
{
scanf("%d",&x);
if(!mp[x])
{
mp[x] = ++cnt;
}
++a[mp[x]];
}
sort(a+1,a+cnt+1);
int ans = 0;
for(int j = 1 ; j <= t ; j++)
{
int m = 0;
// for(int i = 1 , k = j ; i <= cnt ; ++i)
// {
// if(a[i] >= k)
// {
// m+=k;
// k*=2;
// }
// }
int la = 1;
for(int k = j ; k <= t ; k*=2)
{
int pos = lower_bound(a+la,a+cnt+1,k)-a;
if(pos == cnt+1)
break;
m+=k;
la = pos + 1;
}
ans=max(ans,m);
}
printf("%d\n",ans);
return 0;
}