TZOJ 挑战题库随机训练09(JAVA)

点击题号跳转

A4789 B1123 C4266 D3672 E3412

F5360 G4871 H5331 I2291 J5610

A.传染病控制回到顶部

题意

给一棵树1为根被感染,每次切断一条边,然后从已经被感染的传播到相邻节点,若相连则被传染,问如何操作使得感人的人最少,n<=300

题解

考虑一个贪心做法,显然可以按照深度下来,求出每个点对应的深度,每次切对应深度的点儿子最多的树

显然这样并不能AC,考虑一种情况,一个节点一条链儿子最多,另一个节点分叉,那么如果切分叉,再来切链显然比贪心更优

那么就需要搜索所有的情况,显然按照贪心思路下来,获得的值较优,再来剪枝复杂度会大大降低,复杂度O(常数*n^2)

代码

A

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就知道快炸了)

代码

B

C.Arithmetic Progression回到顶部

题意

n个数,求最长连续递增子串,n<=100000

题解

对原数组做一次差分即a[i]=a[i]-a[i-1],求得最长连续相同子串,注意n=1输出1,复杂度O(n)

代码

C

D.To be a Palindrome回到顶部

题意

给一个长度<=100的串,接上一个最短的串使得回文

题解

长度很短,直接暴力把所有情况枚举一下,复杂度O(100^2)

代码

D

E.Railroad回到顶部

题意

给两个队列,问能否构造出一个队列满足条件,n<=1000

题解

dp[i][j][k]表示第一个队列到i,第二个队列到j,答案队列到k

显然已知i和j,那么k固定,所以dp[i][j]即可

那么合法的方案数为1000^2个,那么直接深搜即可解决,复杂度O(n^2)

代码

E

F.统计数字个数回到顶部

题意

给n个数,求合法数字个数(数字中可能夹杂着错误符号,但不会包含小数点、空格等,也不会出现有前导符0的的情况如0123或-0123等,每个数字长度不超过10)

题解

题意数据的构造,按照题意判断,复杂度O(1)

代码

F

G.文化之旅回到顶部

题意

n个点m条边,每个点有一个文化,对于(u,v,w)如果文化不同则连通,问S->T的最短路,n,k<=100,m<=n^2

题解

n只有100,直接floyd算出任意两点的最短路,直接搜索,复杂度O(n^3)

代码

G

H.同花顺2回到顶部

题意

给一副牌,判断是否同花顺

题解

模拟,求出花色对应的点数,判断连续5个是否合法,细节题,复杂度O(n)

PS:一度空指针异常,原来是对象数组得new两次,一次是指针空间,一次是对象空间

代码

H

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的方式实现非阻塞来保证线程并发访问时的数据一致性

但是它的迭代器是弱一致性的,不能保证完全一致性。例如一个线程在遍历,另一个线程在修改不会抛出异常

代码

I

J.简单21点游戏回到顶部

题意

给n张牌,判断和21的关系

题解

按题意来,复杂度O(n)

代码

J

猜你喜欢

转载自www.cnblogs.com/taozi1115402474/p/12734925.html
今日推荐