2018.07.17【省赛模拟】模拟B组 比赛题解(&总结)

7 篇文章 0 订阅
7 篇文章 0 订阅

今天一看排名,what the,又垫底了,新初二第一YYT287.5,第二WYD120

T1:

最大公共子串  

分类讨论+DP

题目描述

从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下的字符按原来的顺序组成的串是该串的字串。例如:“”, “a”, “aaa”,“bbb”,“xabb”,“xaaabbb”都是串“xaaabbb”的字串。(例子中的串不包括引号)
编程求N个非空串的最长公共子串的长度。
限制:2<=N<=100:N个串中的字符只会是数字0,1,…,9或小写字母a,b,…,z;每个串非空且最多含100个字符;N个串的长度的乘积不会超过30000。

输入

文件第一行是一个整数T,表示测试数据的个数(1<=T<=10)。接下来T组测试数据。各族测试数据的第一行是一个整数Ni,表示第i数据中串的个数。各组测试数据的第2到N+1行中,每行一个串,串中不会有空格
,但行首和行未可能有空格,这些空格当然不算作串的一部分。

输出

输出T行,每行一个数,第I行的数表示第I组测试数据中Ni的非空串的最长公共子串的长度

样例输入

1
3
ab
bc
cd

样例输出

0

别说什么后缀自动机,我只会一种做法:分类讨论

首先看看一个东西:N个串的长度的乘积不会超过30000

总共小于等于100个串,每个串最多100个

1,n=2:因为30000开平方100+,比较大,先跳过

2,n=3:30000开立方30+,还是大,再跳

3,n>3:30000开四次方就只有13点几了,弄个全排列枚举长度最小的串,再设f[i,j,k]表示第i个字符串的第j位的下一个数字或字母k是什么(将ASCII码转一下就好),再记忆化一下随便搞搞就好

回来看1和2,弄个f[i,j]和f[i,j,k]DP一下就行了

T2:

分球

宽搜+hash

题目描述

  在一个装满财宝的屋子里,有2N个盒子排成一排。除了两个相邻的空盒外,其余的每个盒子里都装有一个金球或者一个银球,总共有N-1个金球和N-1个银球。以下是一个N=5时的例子,G表示金球,S表示银球:
  
  任意两个相邻的非空的盒子里的球可以移动到两个相邻的空盒中,移动不能改变这两个球的排列顺序。写一个程序,用最少的移动次数把所有的金球都移到所有银球的左边。

输入

 输入文件包含多组数据。第一行为K(K<=5),表示数据的总数。
  每组数据的第一行是N(3<=N<=7),第二行是2N个盒子的初始状态。金球用a表示,银球用b表示,空盒用空格表示。每两组相邻数据用空行隔开。

输出

 对于每一组数据,若无解则输出一行-1,若有解,输出最少移动次数。

样例输入

3
3
abab  

5
abba  abab

6
a  babbababa

输出

-1
3
4

 首先题目中那个每组数据空一行别理它。

弄个宽搜,记录一下步数,字符串,用hash存一下字符串编号,一满足条件就退出。

T3: 

使命的召唤

匈牙利算法

题目描述

你玩过call of duty这个游戏吗?这个游戏以诺曼底登陆为背景,假设你是盟军的一员,身在前线去完成许多任务而粉碎纳粹的野心。现在假设有一个任务,德军有很多机枪阵地,火力很猛,如果不把它们摧毁就会对盟军的推进造成很大损失,盟军打算派出一些敢死队员深入阵地把这些机枪阵地炸毁,当然,敢死队员会有很大的生命危险,所以盟军的指挥官希望你能帮他把损失降到最少。

输入

输入数据第一行是一个整数n(1<=n<=200),代表有多少个机枪阵地需要摧毁。然后接下来n行,每行两个整数xi,yi,代表每个机枪阵地的坐标(0<=xi,yi<=30000),然后接着一个整数m(m<10000),跟着有m行,每行两个整数p和q(1<=p,q<=n,p<>q),代表机枪阵地p和机枪阵地q之间有路相连,敢死队员炸掉一个机枪阵地之后,必须从当前的机枪阵地出发沿着路到达下一个x坐标比当前阵地大的阵地(因为机枪阵地的纵深方向是沿着x坐标递增方向的),如果不存在这样的阵地,那这名敢死队员就完成任务了。简单来说,一个敢死队员可以空降到任意一个机枪阵地(设为a0),然后从这个阵地出发按照上面所述可以摧毁一系列机枪阵地(顺序列为a0,a1,a2...ak),而这一系列机枪阵地的x坐标满足(x0 < x1 < x2 < ... < xk)。从安全和效率出发,每个敢死队员可以带任意个炸弹。任意两个敢死队员的路线不能有交点。现在问你怎么安排敢死队员的路线,可以使到用最小数目的敢死队员去完成这个艰巨的任务。

输出

输出一个整数,就是所求的敢死队员的最小数目。

样例输入

4
25990 5850
8263 2957
1067 22231
4109 4577
3
4 1
2 4
1 3

样例输出

2

解释:
上面的例子最少需2个敢死队员,1种方案是:1个摧毁阵地4后再去摧毁阵地2,1个敢死队员摧毁阵地3后去摧毁阵地1。
 注:一个敢死队员走到某个点,其所有子节点都被走过的话就不用也不能走了;交点指不能走到同一个点

我们可以看出每个点只会连向x值大的点,如果我们把这副图变成一副二分图,给第i个点复制一个点i+n,(x,y)这条边视为连接(x,y+n),这样再弄个最大匹配,每个点只能连一条边且使连接数最大,最后扫一下出点(即编号大于n的点)有哪些点没有连边,就需要投放一个敢死队员

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值