多校联合赛   第一场

本文总结了一次多校联合编程竞赛的经历,详细介绍了九道题目的解题思路和技巧,涉及状态压缩DP、匈牙利算法、动态规划等多种算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多校联合赛总结

第一场(HNU

第一题 :状态压缩dp,这是赛后才学习的。我们把字符串看作节点,然后以重叠部分最大长度建边,求一条最长的哈密尔顿路便能得到总的最小长度。这个题比较有意思的是让构造出最小的解。

Dp[v][G] 表示从V出发走到G并走完G能得到的最长路。然后再记录下推倒过程

Path[v][G][0] 表示 v出发,当dp[v][G]取得最小值时,与v连接的G中的点的个数

Path[v][G][k]表示  dp[v][G]取最小值时,能连接的G中的第k个点

然后直接搜索构造,搜索时有优化,那就是我们尽量选取字典序小的01串放到前面,而且本体内没有01串相同的串。也没子串。

 

第二题 :匈牙利算法, 这个题比赛时和队友讨论了很久才得到结果,wa2次,因为思路错误,导致错误代码写了2次,这都是经验啊! 如果不是很拿得准的时候,最好确定一下再写。建图方式 : 将人拆成点分为左右两边,我们将有矛盾的两个人之间连边,且因为同时讨厌猫和同时讨厌狗都会引起冲突,也就是说冲突应该有两种,一种是猫的冲突,一种是狗的冲突,但是由于二分图建立的图是无相的,因此,如果我们单单是因为有冲突就将两个点相连,很明显是不对的,而且左边有a1, b1(两个人)右边还有a2, b2(这是由于将人拆点导致的)有了矛盾我们是连a1b2还是a2b1呢? 很明显这里冲在问题。因此我们将猫和狗的冲突分开,由于猫导致的,我们从左向右引边,如果是狗导致的矛盾,我们就从右向左引边,这样矛盾就不会冲突了。而且同一个矛盾只会出现一次。

 

第三题 :这也是思想很好的题,赛后才学会的, 一共有四中操作

我们让三个数字有序abc L = b –a,   R = c – b;

1:中间向左跳

2:中间向右跳

3:左往中间跳(L < R

4:右往中间跳  (L > R)

也就是说同一时刻我们只有三种操作。但是利用这三种操作搜索,也是会死人的,状态数太多(深度可能达到10^9)。于是乎我们观察这三个操作,他们是可逆的,假设b跳过a左边,产生了(a – L, a, c), 那么a-L跳到中间必然能产生(a, b, c);这就让我们想到可不可以建一个图来表示这些操作,这样的话我们就可以在表示出这四个操作能得到所有状态的同时,使得操作有序话,而且由于往中间跳的操作同时之能有一种,所以我们可以的出一个结论,也就是说这个图有一个根,也就是说它是一棵树。父节点表示往中间跳,左右孩子分别表示往左右跳。(多么巧妙啊!)然后这个题就可以做了,让我们判断能否从给定的状态s走到给定的转台T,那么我们只需要看sT是否同根即可,右让我们求最少的操作S变为T,那么也就是让我们求这个数中,ST的最近公共祖先,最近公共祖先可以通过将两个点调整到同一高度,然后二分一个距离,看两个点能否走到同一个点,能的话减小距离,不能就增加距离。

由于左面往中跳K次导致L不变,R = R - K ×L。利用这个我们能够快速求出到根的距离。
返回步长应该是mid × 2 + step

二分应该是l <= r



第四题:动态规划(后来做的)其实这个题后来想想还是不是很难的。原始的问题会比这个题少一个操作那就是花费1的费用将某个字符后边的全变成某个字符。之前我们利用状态

Dp[i][j]第一个串的后i个和第2个串的后j个完全匹配后需要的最小步数。那么现在增加的操作是Suffix changekp之后所有字符变为某个k。那我,在我们dp[i]的时候,我们关心的问题就是在i之前是否进行过Suffix changek)操作,如果有,那么我们的dp[i]就再也不是之前的情况了。因此增加一维dp[i][j][k]表示在i之前最后进行了suffix K操作并且后i和后j完全匹配最小话费。这样就可以从后往前dp

转移方程:(52表示没进行suffix操作)

Dp[i][j][k] = MIN{   (K < 52) 时:

 dp[i + 1][j][k] 删掉一个字符i

 dp[i][j + 1][k] j对应位加一个字符

 dp[i + 1][j + 1][k] + 1  (str2[j] = k)  i + 1出用了suffixi处不用操作

 dp[i + 1][j + 1][str2[j]] + 1  i处来一次suffix

K = 52 时(即前面没用过操作suffix

dp[i + 1][j][k] 删掉一个字符i

 dp[i][j + 1][k] j对应位加一个字符

 dp[I + 1][j + 1][k]  ?+ 1    (str1[i] == str2[j] ?)

 dp[I + 1][j + 1][str2[j]] + 1   (i处进行一次suffix的操作)   

}

 

 


第五题:一个图内三点间最近距离,当时队友做的,后来自己做的时候,居然也忘掉了枚举一个点imap[i][0] + map[i][1] + map[i][2]的最小值。这个题三次dijstraspfa能过,Floyd优化下也能过。

 

第六题:这个题利用hash,右列了一个方程,准确的确定了一下在n的范围内能与x形成等差的数(比x小的)K有哪几个,然后hash表一步一步的填充,如果在进行到x的时候

存在一个k2x-k没有同时在hash中出现,说明这个x满足。 正解没看懂。。。

 

第七题 :计算几何题,(后来做的)。细心的分析一下,其实也不是一道难题,之前被计算几何吓倒了。 每次旋转的转动量和长度都是一样的,而在圆上的点可以当作是从圆心到那个点的一个向量,同样可以利用向量旋转来的到点旋转n此后的坐标。

 

第八题 :水题, 枚举即可。

 

第九题 :也是水题吧,强联通分量的题,不过作为全场第一个过的,还是小高兴一下。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值