codeforces 1077E Thematic Contests

匿名 (未验证) 提交于 2019-12-02 22:59:29

题目:

传送门

题意:

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!