题目:
题意:
给出一些题目的,其中有些题目是重复的,举办连续举办几场比赛,每次比赛的题目必须相同,但是一种题目只能举办一次比赛,而且后一场比赛的题目量必须是前一场的2倍,第一场比赛的题目量可以任意选择,之后的场比赛必须遵循上面的规则。
思路:
先对题目进行归类,即求出同一种题目的数量,然后排序,之后从初始一场到最多场开始找,在找的时候进行二分。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
typedef long long ll;
map<ll,int>ma;
const int maxn=2*1e5+5;
ll a[maxn];
ll Min=0x3f3f3f3f,Max=-1;
int n,num=0;
ll sum=0;
ll Judge (ll x)
{
ll tsum=0,j=x;
int pos=0;
while (1)
{
pos=(lower_bound(a+1+pos,a+num+1,j)-(a+1));
if(pos==num) break;
pos++;
tsum+=j;
j<<=1;
}
return tsum;
}
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++)
{
ll x;
scanf("%lld",&x);
if(ma[x]==0)
ma[x]=++num;
a[ma[x]]++;
}
sort(a+1,a+num+1);
Min=a[1]; Max=a[num];
ll l=Min,r=Max;
for (ll i=1;i<=Max;i++)
{
sum=max(sum,Judge(i));
}
printf("%lld\n",sum);
return 0;
}