题目:
题意:
给出一些题目的,其中有些题目是重复的,举办连续举办几场比赛,每次比赛的题目必须相同,但是一种题目只能举办一次比赛,而且后一场比赛的题目量必须是前一场的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; }