20190813B组

20190813B组

T1:100(100)

赛时:

看到题目和时间限制,就知道是一道水题。

只要不用n^{^{2}}级别的方法,用nlogn级别的都行

算法:

排序

T2:100(100)

赛时:

数据范围和字符匹配得知,是一道简单的kmp算法的题。

只不过在预处理p这个转移数组时,改变一下。

算法:

kmp

T3:20(0)

赛时:

看到题目是一道线段树的题,可是多维护了几个参数后。

调试了许久也没有调出,于是便放弃,将普通的暴力用线段树维护一下。

赛后:

又烦躁的调了一波,发现就一个非常小的儿子处理问题。

算法:

线段树

T4:0(0)

赛时:

看着时间不多,打了个最朴素的暴力。

连一点优化都没有便交上去了。

赛后:

分两步处理:

第一步:把问题简单化,假设没有k的限制,设求出来的方案总数是x。

第二步:考虑k的限制,由于k<7,可以穷举n个节目取0个,n个节目取1个,n个节目取2个,n个节目取3个,n个节目取3个,n个节目取4个,n个节目取5个,n个节目取6个,穷举完这几种情况就可以知道哪些方案是合法的。而且Combinations(34,0) + Combinations(34,1) + Combinations(34,2) + Combinations(34,3) + Combinations(34,4) + Combinations(34,5) + Combinations(34,6) = 1676116。

也就是这个穷举不超过1676116次。设第二步的方案总数是y。

 

那么,最后应该输出的答案就是x - y。

 

第二步的方案数y可以搜索计算结果,下面重点讲讲第一步的方案数x如何求。

由于n最大是34,直接搜索会超时。可以把n个节目平均分成两部分,即第1至第n/2个节目归为第1部分,第n/2+1个节目至第n个节目归为第2部分。

 

第1部分:显然最多只有17个节目,每个节目可以取或者不取,穷举这17个节目的所有情况,显然有2^17种取法,对于每一种取法,队伍A都有一个得分,设为scoreA, 队伍B也有一个得分scoreB,队伍C也有一个得分scoreC。不妨设difAB1 = scoreA - scoreB, difAC1 = scoreA - scoreC,即每一种取法,都可以计算出一对值(difAB1,difAC1),

 

第2部分:显然最多也只有17个节目。每个节目可以取或者不取,穷举这17个节目的所有情况,显然也是有2^17种取法。同理,对于每一种取法,设difAB1 = scoreA - scoreB, difAC1 = scoreA - scoreC,即每一种取法都可以计算出一对值(difAB2,difAC2),

 

显然,如果一个方案要成立,必须要同时满足:

difAB1 + difAB2 > 0 (即队伍A的总得分比队伍B的总得分高)

difAC1 + difAC2 > 0 (即队伍A的总得分比队伍C的总得分高)

 

于是,问题转化为,枚举一对值(difAB1,difAC1),在第2部分里面查询有多少对(difAB2,difAC2),使得同时满足

difAB1 + difAB2 > 0

difAC1 + difAC2 > 0

 

显然,对于第2部分,可以用树状数组或者线段树之类的数据结构进行保存,以备第1部分的查询所需。

 

由于分两步求答案,于是时间复杂度 = x + y = 2^17 * Log(2^17) + 1676116

算法:

分治

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章