题意:给你一个数组,可以从中选区若干种元素,但每种元素选区的个数前一种必须是后一种的2倍,选区的任意2种元素不能相同,问可以选取最多的元素个数是多少?

思路1(乱搞):记录一下每种元素的个数,然后暴力枚举最少的元素个数,计算符合题意的最优情况。

代码:

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#include<set>
#include<bitset>
#include<vector>
#include<iostream>
#define INF 0x3f3f3f3f
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pb push_back
using namespace std;
const int maxn=1000010;
map<int,int> mp;
map<int,int>::iterator it;
int a[maxn],b[maxn],cnt;
int v[maxn];
int main(){
int n,ans=0;
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mp[a[i]]++;
}
for(it=mp.begin();it!=mp.end();it++){
b[++cnt]=it->second;
}
sort(b+1,b+1+cnt);
for(int i=1;i<=b[cnt];i++){
int now=0,sum=i;
while(now<=n){
int pos=lower_bound(b+1,b+1+cnt,sum)-b;
while(pos<=cnt&&v[pos]==i)pos++;
v[pos]=i;
if(pos>cnt)break;
now+=sum;
sum=sum+sum;
}
ans=max(ans,now);
}
printf("%d\n",ans);
}

 思路2:DP 设dp[i]为最少元素个数为i时的最优解,将元素的个数从小到大排序后,从后往前更新答案。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=200010;
int dp[maxn*2];
map<int,int> mp;
int a[maxn];
int main(){
int n,ans=0,cnt=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mp[a[i]]++;
}
for(auto i:mp){
a[++cnt]=i.second;
}
sort(a+1,a+1+cnt);
for(int i=cnt;i>=1;i--)
for(int j=1;j<=a[i];j++){
dp[j]=max(dp[j],j+dp[j*2]);
ans=max(ans,dp[j]);
}
printf("%d\n",ans);
}

  

最新文章

  1. volley用法之 以post方式发送 json 参数
  2. Apache 无法启动
  3. javascript中parentNode,childNodes,children的应用详解
  4. mysql之触发器trigger(1)
  5. Jasper_passValue_return value from the subreport to main report
  6. maven新建的项目,不自动引入依赖包
  7. 使用charles抓取htpps的方法
  8. iOS之LLDB常用调试命令
  9. 基于Vue cli生成的Vue项目的webpack4升级
  10. Dynamics 365新引入了多选选项集类型字段
  11. 异常:getHibernateFlushMode is not valid without active transaction; nested exception is org.hibernate.HibernateException: getHibernateFlushMode is not valid without active transaction getHibernateFlu
  12. Docker的安装与使用介绍
  13. hdu 4348 To the moon (主席树 区间更新)
  14. 【译】第12节---数据注解-ConcurrencyCheck
  15. NOI 7614 最低通行费(多段图最短路)
  16. Linux wget安装详解
  17. 【node】安装
  18. PHP 支持简写方式
  19. es5 - array - join
  20. 【Seajs源码分析】1. 整体架构

热门文章

  1. Jenkins自动化部署及代码检查配置应用
  2. hdu 1848 Fibonacci again and again(sg)
  3. Git_学习_07_ 推送修改到远端
  4. hdoj-3342-Legal or Not(拓扑排序)
  5. New Concept English three (58)
  6. 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型
  7. H5实现登录
  8. cocos2dx混合模式应用———制作新手引导高亮区域 (2.2.0)
  9. Git学习原版手稿
  10. php处理redis