cf. (E) Thematic Contests

题意:

第一行给出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;
}
发布了107 篇原创文章 · 获赞 3 · 访问量 7104

猜你喜欢

转载自blog.csdn.net/qq_43504141/article/details/104459081
今日推荐