返回信息流遇到一道毫无思路的算法题,求走过路过的大佬留一下思路[ema1]
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #98326同步于 2019/9/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
[不懂就问] 整除逆推算法题
ys19930828
2019/9/15镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
分两种情况进行处理,如果是中间有连续两个/连续三个字符出现,就可以知道他们的倍数关系,这样你可以把三个变量消成两个/一个变量。
变化后序列全都是一个变量,这样相邻两个变量建立一个大小关系不等式。
最后求出满足不等式下的最小解就可以了
满足不等式下的最小解怎么求,一系列形如 l1<=x/y<=r1 l2<=x/z>=r2 的约束怎么求整数解呀
【 在 allvphx 的大作中提到: 】
: 分两种情况进行处理,如果是中间有连续两个/连续三个字符出现,就可以知道他们的倍数关系,这样你可以把三个变量消成两个/一个变量。
: 变化后序列全都是一个变量,这样相邻两个变量建立一个大小关系不等式。
: 最后求出满足不等式下的最小解就可以了
补充一下3L的思路,我们在最前面加一个0,假如我们只看AB,现在序列是
AB B A A B A AB
从第一个AB开始,到第二个AB结束,AB只算一个的话,中间肯定经历的是A和B的公共倍数,这中间一共出现5个A,3个B,所以有
5A = 3B
所以最小的满足的就是 A = 3, B = 5 ,同样还可以列其他的方程
mA = nC
kA = lD
把这些方程求一个最小整数解就可以了
例如给的例子
B, BC, AB, BC, B, ABC, B
我们在前面补一个ABC
ABC, B, BC , AB, BC, B, ABC, B
现在只看AB
AB, B, B, AB, B, B, AB, B
两个AB之间,只考虑一个AB,一共有1个A,3个B
A = 3B
然后只看AC
AC, C, A, C, AC
两个AC之间只考虑一个AC,一共有2个A,3个C
2A = 3C
求这两个方程的最小整数解,得到 A = 3,B = 1, C = 2
当然,考虑到有些字母没有出现一个完整循环节的情况,需要进一步验证,把求得的最小解带入验证,如果没有循环节的字母可以从小往大插空安排进去,符合预期,如果不能安排进去,求第二小最小解,然后再验证,如此循环直到OK
比如
A, B, D, C, A, AB
填充0
ABCD, A, B, D, C, A, AB
只看AB
AB, A, B, A, AB
得到
3A = 2B
只看AC,得到
AC, A, C, A, A
没有解
只看AD,得到
AD, A, D, A, A
没有解
从A= 2,B = 3开始安排
0ABCD, 1, 2A, 3B, 4 不对(应该跟着A)
安排 A = 4, B= 6
0ABCD, 1, 2, 3, 4A, 5, 6B, 7D, 8不对,(应该跟着A)
安排 A = 6, B = 9
0ABCD, 1, 2, 3, 4, 5, 6A, 7, 8, 9B, 10D, 11C, 12A, 13, 14, 15, 16, 17, 18AB(验证通过)
最后A = 6, B = 9, C = 11, D =12
其实类似于
AC, A, C, A, A
还可以列出不等式
C>A
2A>C
2C>3A
可以降低验证的复杂度,这个看最后时间要求了
【 在 rancho 的大作中提到: 】
: 不难啊,我们在最前面加一个0,假如我们只看AB,现在序列是
: AB B A A B A AB
: 从第一个AB开始,到第二个AB结束,AB只算一个的话,中间肯定经历的是A和B的公共倍数,这中间一共出现5个A,3个B,所以有
: ...................