本文共 4102 字,大约阅读时间需要 13 分钟。
A – meeting
题意:
给一棵n个点的图(保证是树)
给k个点表示k个点上有人,每次走一条边花费1分钟,问所有人走到同一个点最少要多少分钟
思路:
假设任意两个点间距离最大值为d,则d/2向上取整就是答案
最大距离求法类似求树的直径,第一次随便找一个点bfs找到距离当前点最远的点
然后从找到的点在bfs一次找到另外一个最远的点,两个最远点之间的距离就是最大距离
code:
#include #include #include #include #include #include #include #include
D – triples I
题意:
给一个数a,问a能否由多个3的倍数的数通过与运算(&)得来
例如7=3&6
要求数字个数尽量少
思路:
答案最多就两位。
一个二进制位mod 3只可能是1或者2。
若a是3的倍数,那么直接取a即可。
如果a的二进制位只有一位或两位,根本取不出0以外的3的倍数,所以无解。
官方题解:
只需考虑a的二进制位至少
若a mod 3=1:
如果a中的二进制位有至少两个mod 3=1的,设它们为p和q,取a-p,a-q即可。
如果a中的二进制位有恰好一个mod 3=1的,那么设mod 3=1的这个位为p,mod 3=2 的某个位为q,取a-p,p+q即可。
如果a中的二进制位没有mod 3=1的,假设有三个mod 3=2的位p,q,r,我们取ap-q,p+q+r即可。
若a mod 3=2只需把上面的讨论中1与2互换即可,是完全对称的。
code:
#include #include #include #include #include #include #include #include
J – free
题意:
给n,m,s,t,k
表示n个点,m条带权边,s起点,t终点,k表示k条边免费
每条边都要花费
求s到t最小需要花多少钱
思路:
有模板题:
正解:
自己做的时候跑一边最短路,跑的过程种记录最短路径的边,跑完取出权值排序,把除了k个最大的加起来,没想到直接a了,
想了想,感觉如果有两种总权值相同边不同的最短路好像就不行了。
分层最短路code:
#include #include #include #include #include #include #include #include
K – number
题意:
给一串数字问有多少子串是300的倍数
0和00和多个0也算
思路:
300的倍数即0前面是3的倍数后面至少两个0的数
官方题解修改:
记s[i]为前i的和mod3的值(前缀和),对于长度大于等于2的区间[l,r],如果s[l-1]=s[r](这样表明[l,r]里面的和mod3等于0,也就是3的倍数),如果此时s[r]和s[r-1]等于0,那么满足条件,累加答案
从小到大枚举r,同时记录有多少个0<=l<=r-2的l满足s[l]=0,1,2
复杂度O(n)
code:
#include #include #include #include #include #include #include #include
转载地址:http://zluv.baihongyu.com/