ccpc网赛
HDU 6150
题目要求
“最小点覆盖集”是个NP完全问题
有一个近似算法是说————
每次选取度数最大的点(如果有多个这样的点,则选择最后一个)
让你构造一个图,使得其近似算法求出来点数是你给定的覆盖点数的至少3倍。
参考AC代码
|
|
思路
左边n个点(编号较小),
对于每个i∈[1, n],右边新建n / i 个点,每个点选择左边i个点连一条边(总边数为n^2),使得每个i最多只使得左边每个点的度数+1
这样左边每个点的度数都是<=n的,而右边点每个点的度数会分别是{ 1 } { 2 } { 3 } { 4 } … { n }
这样每次会选右边的点去除,去除之后左边的度数依旧<=右边的度数
于是贪心做法会选择右边,大小为nlogn的点集,
而实际只需要选择左边,大小为n的点集即可。
对于题目要求n设为30即可 计算出n=141 m=762
HDU 6152
题目要求
判断给定的图中有没有大小大于等于3的独立集或大小大于等于3的团
参考AC代码
|
|
思路
暴力
注意bool比int占内存少 本题int超内存 而bool比int内存少使用3倍多
也有专门的定理:Ramsey theorem 6个人中至少存在3人相互认识或者相互不认识 n大于等于6直接输出否则暴力
HDU 6153
题目要求
给定两个串,求其中一个串s的每个后缀在另一个串t中出现的次数 相加取mod
参考AC代码
|
|
思路
扩展kmp
先把2个字符串反转化成前缀问题
对s1求next 对s2进行匹配 ekmp求出来的extend[i]表示s1[i..len1-1]与s2的最长公共前缀
该位置对结果的贡献是1+2+…+extend[i] ==(1+extend[i])*extend[i]/2
每个有贡献的extend累加取mod就是所求
HDU 6156
题目要求
已知函数f(x, k),如果10进制数x在k进制下是个回文数,那么f(x, k)值为k,否则为1
现给出l, r, x, y, 求出∑∑f(i, j) (l<=i<=r) (x<=j<=y)
参考AC代码(计算)
|
|
参考AC代码(数位dp)
|
|
思路
通过计算或者数位dp 算出1-n内的回文串个数 用R-(L-1)就是L到R内的回文串个数 枚举进制计算回文数
答案就是temp×进制+(L到R区间内不是回文的个数) 因为题中不是回文也要加1
计算方法:flag代表能不能构成最大的回文数 若高位比地位大 则不能 例如5421不能构成5441 超出上限 若不能结果-1
第一次计算res是按照奇偶的性质 若修改进制后原本的回文串是奇数位 那么计算所有的奇数回文串 偶数同理
第二次res加上的是位数比他小的回文数(原本是奇那么计算偶 反之同理) 稍加计算就可以得到qpow(k,top/2)-1
数位dp代表的是dp[起点][位置][进制] 数位dp模版 注意for里的计算