Codeforces Round #377(div 2)
A、B、C:=,=
D:题意:有n(n<=1e5)天,每天可以选择考某一门科目或者在家复习,一共m(m<=1e5)门科目,每个科目都有特定的需要复习时间,只有复习了足够的天数才可以考并且考过。给出每天的信息,0代表无考试科目,其他代表那天考那一门(当然你可以选择不考,这天复习),问要考过所有科目至少需要多少天,无法考完输出-1
分析:这题是最优化问题,直接考虑不好考虑。
可以转化成二分判定问题,二分天数mid,接下来问题就变成了如何判定mid天内是否可以考完
贪心的思想,从后往前,将最靠后的不同科目标记在时间轴上,从1~mid天贪心,先复习时间轴靠前的。
注意写check函数的时候要考虑到是否所有科目都包含了进去
E:题意:有n个电脑和m个适配器(n,m<=2e5) 他们各自都有自己的电压,要求电脑和适配器电压相同才匹配。对适配器的一次操作可以将其电压除以2向上取整。求最多有多少个电脑可以匹配到适配器,在这个基础上,再求最少操作总次数,并输出方案。
分析:第一眼是二分图匹配,然而范围太大,不可行。
刚开始,如果有电脑和适配器电压相等,那么显然他们直接匹配,不会让结果变差。
剩下的就肯定无法匹配了,所以这些适配器需要操作
可以将这些适配器都操作一次,再和剩余电脑匹配,再反复操作,直到所有适配器电压都是1
这样的操作让适配器都尽可能和电脑匹配,满足让电脑匹配数最大,同时类似BFS的所有适配器同时遍历保证了总的操作数最少。
具体操作上可以用multiset来存电脑的信息,一个数组存适配器信息,模拟一过程就行了。
注意multiset.erase(value)会将所有权值为value的点都删掉,所以删除的时候要删除find()的地址,而不是find()的权值
F:题意:n点m边无向图(n,m<=4e5),没有重边和自环。让你给每条边定向,让点能到达其他点的最小数目最大。
分析:类似有向图求强连通,先用Tarjan求出边双联通分量,缩点成一个树,相当于要给树的边定向,然而必然会有一个分量A连向另一个分量B,题目要让最小到达点数最大,最小到达点数其实就是叶子节点的所含点数,所以ans=最大的双联通分量的size,具体方案可以选择size最大的分量中任意一点dfs遍历所有边,倒过来就是遍历方向。