E. Thematic Contests 二分,离散化

题目意思是给你n个问题即数字,n的大小代表问题所在的话题,题目要求举办多场比赛,每场比赛的只能一种问题,且后一场比赛的问题必须是前一场的两倍,求举办比赛可能最多的问题总数

传送门

解题思路:将出现每种数字对应的话题从一开始标记,用a记录对饮数字出现的次数,排序后,枚举第一场可能的问题次数,之后二分查找后面是否存在问题的二倍数量存在就加上,直到不足二倍。

#include<bits/stdc++.h>
using namespace std;
map<int, int> mp;
const int maxn=2e5+10;
int a[maxn];
int main()
{
    int n;
    scanf("%d", &n);
    int cnt=0;
    for(int i=1; i<=n; i++)
    {
        int t;
        scanf("%d", &t);
        if(mp[t]==0)
            mp[t]=++cnt;
        a[mp[t]]++;
    }
    sort(a+1, a+1+cnt);
    int maxx=-1;
//    for(int i=1; i<=cnt; i++)
//        printf("%d ", a[i]);
//    printf("\n");
    for(int i=1; i<=a[cnt]; i++)
    {
        int ans=0;
        int la=1;
        for(int j=i; j<=a[cnt];j=j*2)
        {
            int pos=lower_bound(a+la,a+1+cnt,j)-a;
            if(pos==cnt+1)
                break;
            else
            {
                ans+=j;
            }
            la=pos+1;
        }
        maxx=max(maxx,ans);
    }
    printf("%d", maxx);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值