A.传染病控制回到顶部
题意
给一棵树1为根被感染,每次切断一条边,然后从已经被感染的传播到相邻节点,若相连则被传染,问如何操作使得感人的人最少,n<=300
题解
考虑一个贪心做法,显然可以按照深度下来,求出每个点对应的深度,每次切对应深度的点儿子最多的树
显然这样并不能AC,考虑一种情况,一个节点一条链儿子最多,另一个节点分叉,那么如果切分叉,再来切链显然比贪心更优
那么就需要搜索所有的情况,显然按照贪心思路下来,获得的值较优,再来剪枝复杂度会大大降低,复杂度O(常数*n^2)
代码
B.Billing Tables回到顶部
题意
n个电话,A - B 电话名,[A,B]的电话号表示改电话名,A,B代表的前缀可以合并,12300-12399可以合并为拨打123就可以知道对应电话名
拨一个电话按顺序下来查找对应电话名,其中电话名为invalid表示区间不可用
问这n个电话最少需要多少电话号表示
PS:题意看了n久n久
题解
显然字典树,我们需要把[A,B]区间插进去,很难做到吧
我们可以只插A和B,然后通过A往右,B往左圈定范围,每次把这个范围往下压
倒过来插入,这样可以覆盖掉原先标记的值,还要注意如果电话名相同可以会出现合并,就需要相同电话名标记相同
uL表示A当前的节点,uR表示B
1、如果uL=uR相当于父节点相同,所有子节点为nxt[uL][j]和nxt[uR][j],子节点只需要更新[L[i]+1,R[i]-1]这一段范围
1、为什么不把L[i]和R[i]更新了,因为最后需要遍历整颗树,遍历条件就是当前节点未被标记
2、但是根需要标记L[i]和R[i],这是结束遍历的标志,相当于尾部节点
2、如果uL和uR不相同,相当于uL更新[L[i]+1,9],uR更新[0,R[i]-1]
接下来要输出方案数,如果节点未被标记,往下遍历,如果已被标记,方案数加上1(如果合法)
由于需要求最少的前缀表示,那么就需要合并,可以知道如果某个节点的子节点0-9都合法,那么合并,合并只需要标记u为nxt[u][j],这样在搜索的时候下面就不会搜索而直接返回了
最后输出所有前缀表示,如果节点未被标记,往下遍历,如果已被标记则输出该方案
PS:好艰难意识模糊(看代码的debug就知道快炸了)
代码
C.Arithmetic Progression回到顶部
题意
n个数,求最长连续递增子串,n<=100000
题解
对原数组做一次差分即a[i]=a[i]-a[i-1],求得最长连续相同子串,注意n=1输出1,复杂度O(n)
代码
D.To be a Palindrome回到顶部
题意
给一个长度<=100的串,接上一个最短的串使得回文
题解
长度很短,直接暴力把所有情况枚举一下,复杂度O(100^2)
代码
E.Railroad回到顶部
题意
给两个队列,问能否构造出一个队列满足条件,n<=1000
题解
dp[i][j][k]表示第一个队列到i,第二个队列到j,答案队列到k
显然已知i和j,那么k固定,所以dp[i][j]即可
那么合法的方案数为1000^2个,那么直接深搜即可解决,复杂度O(n^2)
代码
F.统计数字个数回到顶部
题意
给n个数,求合法数字个数(数字中可能夹杂着错误符号,但不会包含小数点、空格等,也不会出现有前导符0的的情况如0123或-0123等,每个数字长度不超过10)
题解
题意数据的构造,按照题意判断,复杂度O(1)
代码
G.文化之旅回到顶部
题意
n个点m条边,每个点有一个文化,对于(u,v,w)如果文化不同则连通,问S->T的最短路,n,k<=100,m<=n^2
题解
n只有100,直接floyd算出任意两点的最短路,直接搜索,复杂度O(n^3)
代码
H.同花顺2回到顶部
题意
给一副牌,判断是否同花顺
题解
模拟,求出花色对应的点数,判断连续5个是否合法,细节题,复杂度O(n)
PS:一度空指针异常,原来是对象数组得new两次,一次是指针空间,一次是对象空间
代码
I.Parallel computer simulator回到顶部
题意
背景:操作系统CPU切换执行不同程序
n段程序,每段end结束,5种语句分别为a = 1(只有26个变量,赋值<=1000),print a,lock,unlock,end和各自需要执行的时间,再给一个t表示一次单位时间。每次取出就绪队列首部程序id执行一个单位时间;
1、一次单位时间内可以执行多条语句;
2、若单位时间内单位语句未执行完则等到其执行完;
3、若获取lock失败则不会执行其他语句;
4、若unlock则从阻塞队列获得第一个程序id放入就绪队列
5、若程序id还有语句未执行则放入就绪队列尾部
n<=100,单个程序语句数<=200
PS:题意够长够恶心
题解
直接按照题意模拟,双端队列代表就绪队列,队列代表阻塞队列,复杂度O(100*200)
PS:查了一下java中的双端队列和阻塞队列,ConcurrentLinkedDeque(Queue),JDK1.7 JUC包引入,采用无锁算法,底层使用自旋+CAS的方式实现非阻塞来保证线程并发访问时的数据一致性
但是它的迭代器是弱一致性的,不能保证完全一致性。例如一个线程在遍历,另一个线程在修改不会抛出异常
代码
J.简单21点游戏回到顶部
题意
给n张牌,判断和21的关系
题解
按题意来,复杂度O(n)
代码