https://codeforces.com/problemset/problem/1335/C

题意:给定 n 个学生的技能,将其中的学生分为两组,两组的学生人数应该相等,且第一组的学生技能值应互不相同,第二组的学生技能值应该都相同,求最大的学生人数

思路:显然应该用二分查找学生人数,且二分的右端点应该小于 n/2,那么 check 函数应该如何写呢?我们用 map 保存每种技能的学生数,然后我们首先遍历整个 map ,找值不等于 x (要check的每组学生人数) 的人数一共有多少,且当 mp[i] > x 时,mp[i] --,因为当这个学生人数大于 x 时,它在被选入第一组之后可能剩下的人数会等于 x ,也就是可以被选入第二组,此时我们得到了 cnt,也就是可以入选第一组的人一共有多少,然后接下来我们就要分两种情况讨论了

第一种情况:cnt >= x,也就是第一组的人数可以满足,此时我们考虑第二组就简单了,只需要判  断 map 中是否还有人数大于等于 x 的,如果有,直接返回 true

第二种情况:cnt < x,也就是第一组人数还不满足,此时我们要判断 map 中人数大于等于 x 的一  共有多少种,如果 cnt1 > ( x-cnt ),也就是在大于等于 x 的中抽调人去第一组之后,还能够有至少一组来满足第二组

时间复杂度为 O( n * logn )

以下是代码实现:

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;const int N=2e5+10;
map<int,int>mp1,mp2;
int num[N];bool check(int x)
{mp2=mp1;int cnt=0,cnt1=0;for(auto i:mp2){if(1<=i.second&&i.second<=x-1 || i.second>x){cnt++;if(i.second>x){mp2[i.first]--;}}}if(cnt>=x)//第一组人数满足{for(auto i:mp2){if(i.second>=x)//若第二组条件也能满足{return true;}}}else{for(auto i:mp2){if(i.second>=x){cnt1++;}}if(cnt1>(x-cnt))//在抽调人之后仍有一组能满足第二组的条件{return true;}}return false;
}
void solved()
{mp1.clear(),mp2.clear();int n;cin>>n;for(int i=1;i<=n;i++){cin>>num[i];mp1[num[i]]++;}if(n==1) {cout<<0<<endl;return ;}int l=1,r=n/2,mid=0,ans=0;while(l<=r){mid=(l+r)/2;if(check(mid)){ans=mid;l=mid+1;//看看有没有更大的}else{r=mid-1;}}cout<<ans<<endl;return ;
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int t;cin>>t;while(t--){solved();}return 0;
}

Two Teams Composing相关推荐

  1. Codeforce 1335C - Two Teams Composing 统计技能种类数量+统计同一技能最大数量

    [codeforces 1335C] Two Teams Composing 统计技能种类数量+统计同一技能最大数量 https://codeforces.com/contest/1335/probl ...

  2. codeforces C. Two Teams Composing

    题目 题意: 给你一个序列aaa,然后你可以将里面的元素进行分组,第一组的元素全部都要不同的,第二组全部都要相同的最后两组的数量要一样,问最大的数量是多少. 思路: 我们可以用数组cntcntcnt记 ...

  3. Codeforces Round #634 (Div. 3)ABCD

    传送门 这场div3全都是模拟暴力题,第一次打到E1题,E2我tle了后面再补把,a.a 看见t神22分钟ak 文章目录 A.Candies and Two Sisters B.Construct t ...

  4. 使用Teams接收Azure服务运行状况通知

    在本文中,我们将向大家演示如何将Microsoft Azure Service Health的警报信息发送到Microsoft Teams,以便于公司的Azure运维团队可以在Azure资源出现问题时 ...

  5. Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置

    上一节中我们在Teams上面用命令配置好了Voice Routing Policy并分配给用户,理论上这时他的Teams UI上面的拨号盘就会出现.同时我们也建立好了PSTN Gateway, 这样子 ...

  6. Microsoft Teams快速上手系列-08Teams中的内部防火墙

    如标题所示"Teams内部防火墙"这个是什么鬼?!在解释这个名称之前我先分享一个场景: 某金融行业正在使用Office365,其中核心金融数据部门能够与任何内部用户进行点对点沟通文 ...

  7. SCAU 07校赛 10317 Fans of Footbal Teams

    10317 Fans of Footbal Teams 时间限制:1000MS  内存限制:65535K 题型: 编程题   语言: 无限制 Description Two famous footba ...

  8. 改善代码设计 —— 组织好你的数“.NET研究”据(Composing Data)

    系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...

  9. Microsoft Teams快速上手系列-06邀请组织外部用户加入团队

    上一篇文章介绍了Teams如何与外部组织通信.但是在日常的工作中不免不了跨组织的协作,如:XX项目实施,可以通过Teams将甲方和乙方同时加到一个Teams当中,让项目进行更顺畅.下面跟大家分享如何将 ...

最新文章

  1. JS中confirm,alert,prompt函数
  2. R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理、构建词袋模型、构建xgboost文本分类模型、基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化
  3. python类的参数传递
  4. 阿里大鱼.net core 发送短信
  5. Android开发中,eclipse找不到已存在的layout资源文件
  6. 张睿:OpenH264拥有产品级的鲁棒性 欢迎contribute
  7. “”和“” java
  8. dnf用虚拟机会被制裁吗_DNF: 神豪奶妈扬言, 战斗力没有超过他的, 都不配被加buff!...
  9. __construct()和__initialize()
  10. ab实验置信度_为什么您的Ab测试需要置信区间
  11. abap常用系统变量
  12. 打开储存在服务器的文件,云服务器储存文件
  13. MySQL笔记(十)MySQL事务 transaction
  14. Mean Shift算法(2)在OpenCV上的实现目标跟踪——直方图反向投影
  15. 如何免费注册使用虚拟主机和二级域名建站
  16. ./configure 出错Your intltool is too old. You need intltool 0.35
  17. 蒙特卡洛模型之神奇的布丰投针实验
  18. 身份证前6位城市代码
  19. 韩天峰php教程,韩天峰(Rango)的博客
  20. 美国大学计算机科学专业排名2020,美国大学计算机专业排名2020情况如何?

热门文章

  1. 自驾出游系列之(二): 自驾游应该了解的各地春节民俗
  2. 熊猫烧香超级搞笑广告版本
  3. 欺骗的艺术——第二部分(11)
  4. 那些git中常见的面试题及知识点
  5. cadence SPB17.4 - allegro - allegro_free_viewer
  6. 解读VL162最新Switshi切换芯片是VIA最新推出的Switsh芯片USB 3.1 Type-C接口数据切换开关专用芯片
  7. 什么,BOM指的是物料清单?
  8. 绵阳计算机维修价格,绵阳台式电脑维修
  9. Django Web 官方 中文文档 开发手册
  10. 设置coursera DNS