简单随机化

CodeChef - MSTONES

平面上有 \(n\) 个点 \((x_i,\ y_i)\) ,保证这 \(n\) 个点可以用 \(7\) 条直线覆盖。找出一条直线使得它覆盖的点最多

\(30\) 组 Test

\(n\leq10^4;\ |x_i|,\ |y_i|\leq1.5\times10^4\)

每次随机找两个点 \(A,\ B\) ,判断它们所在的直线所覆盖的点数,找到答案的概率为 \(\frac{1}{k^2}(k=7)\) ,时间复杂度 \(O(Tnk^2)\)

也有一个确定性算法:当 \(n<k^2\) 时暴力,当 \(n\ge k^2\) 时可以发现题目给定的 \(k\) 条直线点数一定大于等于 \(k\) ,故可以固定一个点,找到覆盖它的直线的点数最大值(可以按斜率考虑),若大于等于 \(k\) 则删掉这些点递归,时间复杂度 \(O(Tkn\log n)\)


杂题

给定一个 \(n\times m\) 的矩形,每个点有一种颜色 \(a_{i,\ j}\) ,你可以从 \((1,\ 1)\) 出发,每次走到与它四连通的格子上,问至少经过 \(k\) 种颜色最少需要走多少步

\(n,\ m\leq30;\ k\leq7;\ a_{i,\ j}\in[1,\ 1000]\)

每次给每种颜色赋一个 \([1,\ k]\) 的权值,将原矩形看做只有 \(k\) 种颜色,然后状压bfs,每次结果为正确答案的概率为 \(\frac{k!}{k^k}\)

时间复杂度 \(O(Tnm2^k)\)


杂题

给定一个 \(n\times m\) 的矩形,每个位置有一个权值 \(a_{i,\ j}\) 和一个颜色 \(c_{i,\ j}\) ,找一个四连通块使得包含了至少 \(k\) 种颜色并且权值和最小

\(n,\ m\leq15;\ k\leq7;\ a_{i,\ j}\in[1,\ 10^5]\)

如上随机化赋值,问题转化为了求斯坦纳树,时间复杂度 \(O(T(nm3^k+\operatorname{spfa}(nm,\ nm)2^k))\)

猜你喜欢

转载自www.cnblogs.com/Juanzhang/p/11746893.html