E - Medals

首先看到这题看不出是一个匹配的题大佬题解

把每一个工人和每一天看成一个二分图,如果某个工人在某天工作,那么两者存在边,现在问题转化成至少需要多少天,能够把nnn个工人全部匹配kkk次

显然天数可以二分,然后问题转化成判断1→mid1\to mid1→mid天是否能够让工人完全匹配,然后就需要用到霍尔定理。

Hall 定理:二分图存在最大完备匹配的充要条件是与某一侧的任意 kkk 个点相连的另一侧的节点 ≥k\ge k≥k个。

按照霍尔定理枚举每一个集合,假设该集合中我们任意选择了iii个工人,那么至少有k×ik×ik×i天与之匹配,那么这iii个工人工作天并集的天数≥k×i\ge k×i≥k×i。显然不容易求iii个工人工作天的并集的天数,于是考虑补集转化,我们可以求出有哪些天没有所选工人集合的元素,然后用总天数减去即可。

代码:

  1. 预处理某天有哪些工人能够工作,状态压缩!
  2. 预处理二进制中1的个数表示选择的集合有多少人
  3. 二分中cnt[]数组表示一个桶,cnt[i]表示选择工人集合是ii看成一个二进制数)的子集天数和
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=19,K=100010,M=3*N*K;
int work[M];
int n,k,a[N];
int one[1<<N],cnt[1<<N];
bool check(int mid)
{memset(cnt,0,sizeof cnt);for(int i=1;i<=mid;i++) cnt[work[i]]++;for(int i=0;i<n;i++)for(int j=0;j<1<<n;j++)if(j>>i&1) cnt[j]+=cnt[j^(1<<i)];for(int i=0;i<1<<n;i++)if(one[i]*k>mid-cnt[(1<<n)-1-i]) return 0;return 1;
}
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n>>k;int m=n*k*3;for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++)for(int j=1;j<=m;j++)if(((j-1)/a[i]&1)==0) work[j]|=1<<i;for(int i=1;i<1<<n;i++) one[i]=one[i>>1]+(i&1);//初始化1的个数int l=n*k,r=m;while(l<r){int mid=l+r>>1;if(check(mid)) r=mid;else l=mid+1;}cout<<l<<'\n';}return 0;
}

总结:一般求并集的东西都可以考虑补集转化,求出补集所有子集的个数,然后再用总数减即可。

反思:自己对于集合相关技巧掌握不好~~

ARC106——E - Medals相关推荐

  1. Gym 101158G Placing Medals on a Binary Tree

    题意:有一颗无穷大的满二叉树,每一次我们向树上的某一层的某个节点放置奖牌,奖牌排斥的条件为:从该节点到根的路径上无其他奖牌,如果能放置则放置,否则不放跳过,并且要按照输入的顺序放置,每次输出Yes或者 ...

  2. Placing Medals on a Binary Tree

    https://vjudge.net/contest/175792#problem/G 题意:有一颗完全二叉树,深度从0至1e9,给出n个数字,分别代表把金属加到深度为a[n]的一个结点上,要求每个放 ...

  3. Go 学习笔记(4)— Go 标识符、数据类型之间转换、布尔型、整型、浮点型、interface 类型

    1. 标识符整体分类 Go 标识符整体分类如下图所示: 2. 数据类型分类 Go 语言按类别有以下几种数据类型: 类型 描述 布尔型 布尔型的值只可以是常量 true 或者 false 数字类型 整型 ...

  4. Python绘制桑基图

    很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况.例如,以居民如何从一个国家迁移到另一个国家为例.这里演示了有多少居民从英格兰迁移到北爱尔兰.苏格兰和威尔士. 桑基图简介 从这个 桑基图 ...

  5. python 用for循环生成字典_我需要创建一个for循环来生成嵌套字典

    我需要创建一个for循环,该循环会在每次检测到不存在的键时生成一个新的嵌套字典.我正在从以前的函数中获取外部字典的信息. >它将需要创建一个字典,以可用的运动作为其键,并以字典作为其 值. &g ...

  6. discuz 后台页面开发

    后台页面开发 创建项目 在 ./source/admincp/menu/ 目录下创建 menu_mynav.php 文件 在"管理中心-全局"中加一个项目,需要在 menu_myn ...

  7. 2020年,知识图谱都有哪些研究风向?

    2020-07-22 01:44:58 编译 | Mr Bear 编辑 | 丛 末 随着认知智能走进了人们的视野,知识图谱的重要性便日渐凸显.在今年的自然语言处理顶会 ACL 2020 上,自然语言知 ...

  8. HDU 4352 数位dp + LIS(nlogn) + 状态压缩

    #define xhxj (Xin Hang senior sister(学姐))  If you do not know xhxj, then carefully reading the entir ...

  9. discuz 文档说明

    Discuz  文档说明 基于7.0的标准程序,部分与插件无关的文件不作说明 文件颜色说明: 红色:程序核心文件,修改这类文件时千万要注意安全! 橙色:做插件几乎不会用到的文件,大概了解功能就可以了, ...

最新文章

  1. LeetCode 804 Unique Morse Code Words--python,java解法
  2. 虚拟机安装Ubuntu14.04打开FireFox提示Server not found
  3. 20160626001 O2O Website
  4. Codeforces 1323 div2题解ABC
  5. QT 子窗体 最大化 界面显示不对
  6. Visual Studio 内存泄漏检测方法
  7. java自定义方法参数注解_Java方法中的参数太多,第1部分:自定义类型
  8. 2021年慈溪中学高考成绩查询,2021年慈溪市高考状元名单资料,今年慈溪市高考状元多少分...
  9. dynamic image
  10. HDU 4455 Substrings(线性dp,很有意思)
  11. 解决IOS 原生项目加载html上下可滑动
  12. 使用Gson 解析json文件
  13. 图像处理(四) Sobel边缘检测与canny边缘检测对比
  14. 分享抖音上热门技巧!短视频涨粉+运营攻略!
  15. caputo分数阶导数程序_caputo分数阶导数
  16. U盘如何使用量产工具格式化
  17. Alibaba Cloud Linux 搭建Frp内网穿透服务(兼容Centos)
  18. 《21天学通HTML+CSS+JavaScript Web开发(第7版)》——2.8 作业
  19. 文件上传之500错误
  20. 【python】 爬取网易云音乐 专辑图片+歌词

热门文章

  1. fcn网络训练代码_另辟蹊径,中科院自动化所等首次用图卷积网络解决语义分割难题...
  2. sublime text html乱码,Sublime Text 2中文显示乱码的解决方法
  3. aop springboot 传入参数_Springboot添加AOP打印请求参数
  4. python自然语言处理_python
  5. 一个例子带你搞懂python作用域中的global、nonlocal和local
  6. 计算机学科的三大科学形态,华中科技大学 计算机科学与技术方法论 3计算学科中的三个学科形态.ppt...
  7. [Java基础]反射获取构造方法并使用
  8. c++ 位运算_C语言之运算符
  9. 临界区、互斥量、信号量、事件的区别
  10. 梯度下降:求线性回归