E. Thematic Contests

题意
现在有n个题目,每种题目有自己的类型,1&lt;=n&lt;=2∗1051&lt;=n&lt;=2*10^{5}1<=n<=2∗105
要举办一次考试,
考试的原则是
每天只有一种题目类型
一种题目类型只能出现在一天
每天的题目类型不能相同,
而且后一天的题目数量必须正好为前一天的两倍,第一天的题目数量是任意的
求怎么安排能使题目尽量多。注意:不是天数尽量多

做法
首先我们知道一件事,题目属于哪种类型并不重要,重要的是每种类型的个数
所以我们先统计出所有类型的个数,存进一个数组,
而最终最优解一定是按照题目数量从小到大来的,所以我们对该数组进行排序
而我们怎么确定最终怎么选择呢,我们发现最终怎么选择取决于第一天怎么选择
而且只要确定了第一天的题目数,只要在排序好的数组上采取能选就选的原则,
就可以O(n2)O(n^2)O(n2)的时间复杂度解决这道题
可是这个复杂度并不能通过,所以我们要看哪个过程可以优化
第一天的题目数并不满足二分的性质,我们就考虑优化能选就选这个原则
在排好序的数组上我们可以通过lower_bound快速找到>=当前所需数目的下标pos
之后让pos++,继续下一次查找,这样我们最多查找log次就能完成check
于是这道题就是O(n)O(n)O(n)枚举第一天的题目数,O(logn)O(logn)O(logn)check,总复杂度O(nlogn)O(nlogn)O(nlogn)

坑点

check的时候所需题目数&gt;=2∗105check的时候所需题目数&gt;=2*10^5check的时候所需题目数>=2∗105直接跳出
每次找到下标之后让下标++,并在之后的范围内二分

代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 2e5+5;
int a[maxn];
map<int,int> mp;
int x[maxn];
int n,cnt;
int solve(int mid)
{int tmp=mid;int ans=0;int pos=1;while(true){pos=lower_bound(x+pos,x+1+cnt,tmp)-x;if(pos==cnt+1) break;//没找到直接breakans+=tmp;tmp=tmp*2;//下一天需要的题目数翻倍pos++;if(pos==cnt+1||tmp>200000) break;//找到头或者不可能继续找}return ans;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);mp[a[i]]++;}map<int,int>::iterator it;for(it=mp.begin();it!=mp.end();++it){x[++cnt]=(*it).second;}sort(x+1,x+1+cnt);//得到每种类型的数目,并排序int ans=0;for(int i=1;i<=200000;i++) ans=max(ans,solve(i));//O(n)枚举第一天的题目数printf("%d\n",ans);return 0;
}

【 Codeforces Round #521 (Div. 3) E. Thematic Contests】二分+STL相关推荐

  1. Codeforces Round #725 (Div. 3) G. Gift Set 二分

    传送门 文章目录 题意: 思路: 题意: 有两种物品分别有x,yx,yx,y个,每次可以从一个拿出aaa个,另一个拿出bbb个分成一组,问最多能分成多少组. 思路: 这个题有一个显然的单调性,所以二分 ...

  2. Codeforces Round #521 (Div. 3)

    题目链接:http://codeforces.com/contest/1077 A.Frog Jumping 解题思路:作差再判断最后是否还要向右跳一次即可. AC代码: 1 #include< ...

  3. B. Disturbed People(模拟) Codeforces Round #521 (Div. 3)

    原题链接: https://codeforces.com/contest/1077/problem/B 样例: Examples Input 10 1 1 0 1 1 0 1 0 1 0 Output ...

  4. Codeforces Round #521 (Div. 3) B - Disturbed People (贪心)

    题目链接:http://codeforces.com/contest/1077/problem/B 题意:给你一长度为n的01序列.0表示当前位置的房子灯是灭的,1表示当前房子的位置灯是亮的.判断某个 ...

  5. CodeForces Round #521 (Div.3) B. Disturbed People

    http://codeforces.com/contest/1077/problem/B There is a house with nn flats situated on the main str ...

  6. Codeforces Round #521 (Div.3)题解

    A过水,不讲 题解 CF1077B [Disturbed People] 这题就是个显而易见的贪心可是我考场上差点没想出来 显然把一户被打扰的人家的右边人家的灯关掉肯定比把左边的灯关掉 从左到右扫一遍 ...

  7. Codeforces Round #521 (Div. 3): F. Pictures with Kittens(DP+单调队列)

    题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x,表示你要从中选出刚好x幅画,并且相邻两幅画的距离不能≥k,好看程度之和最大能多少,选不出来输出-1,F1数据范围<200,F2 ...

  8. Codeforces Round #521 (Div. 3) B. Disturbed People

    There is a house with nn flats situated on the main street of Berlatov. Vova is watching this house ...

  9. Codeforces Round #521 (Div. 3) B. Disturbed People 思维

    题解 题目大意 n个灯0关灯1开灯 101则中间的睡不着 问最少关掉多少个灯可以全都能睡着 遇见101则将后面的1的灯泡关掉 这样解决10101的问题 计数输出即可 AC代码 #include < ...

  10. Codeforces Round #321 (Div. 2) Kefa and Company 二分

    原题链接:http://codeforces.com/contest/580/problem/B 题意: 给你一个集合,集合中的每个元素有两个属性,$m_i,s_i$,让你求个子集合,使得集合中的最大 ...

最新文章

  1. ios button.imageview 和setimage的区别
  2. 怎么看android底层源码,Android 底层按键获取
  3. ActiveMQ的Transport Connectors配置(六)
  4. Vue.js(17)之 插槽
  5. Java Calendar hashCode()方法与示例
  6. 出现503错误 怎么办
  7. 神经网络-损失函数是不是凸的
  8. Go语言计时器的使用详解
  9. python2.7能调用java_Python可以调用Java框架吗?
  10. MySQL高级-SQL优化
  11. bzoj 1406: [AHOI2007]密码箱
  12. PHP面试常考内容之面向对象(2)
  13. SpringBoot系列: Pebble模板引擎语法介绍
  14. 2018黑马39期WEB前端视频教程
  15. CAD工具——导出JPG
  16. 文件和异常——python从编程入门到实践
  17. 黑马程序员——从迷茫的大学认识黑马
  18. Arduino框架下 ESP32看门狗使用示例
  19. 如何快速将WPS表格或者excel数据将表格转化为json
  20. c/c++编程学习:空指针是什么?

热门文章

  1. 首家新三板上市区块链公司:他们提供面向政务、商务、公众等解决方案
  2. 1741. Communication Fiend(dp)
  3. 火狐Firefox安装屏蔽广告插件ublock origin方法
  4. 计算机保研个人简介,保研个人简历模板
  5. 新项目六之集成新版友盟统计
  6. msgbox php,HTML_MsgBox函数语言参考,描述  在对话框中显示消息 - phpStudy
  7. [转]让你的网页文本框增加光晕效果与提示,水印(类似QQ2011)
  8. pythonRuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing
  9. poi生成Workbook转成pdf(java实现excel转pdf)
  10. 计算机科学与技术学科带头人,计算机专业学科带头人—陆玉昌教授