题目
https://codeforces.com/contest/1216/problem/F
有n个房间,编号[1,n],路由器范围为k。现要给所有房间通wifi。对于房间i,有两种方案:
- 直连网线,话费为i
- 在i建路由器,话费也是i,但这样[i-k, i+k]区间就都连通了
有些房间不能建路由器。求最少花费。
做法
首先,能建基站的一定不会直连。由于基站之间会相互覆盖,所以只需决定哪些保留哪些基站。感觉像是贪心?不知道能不能做。我是用动态规划做的。设f[i]表示只用[1,i]之间的基站,将[1,i]都连通的最小话费。那么有两种情况:
- i直连,花费为f[i-1]+i
- 在某位置j建基站(i-k<=j<=i),这样[j-k,i]之间就都已经覆盖了,只需前面的可以就行。我们需要将前面的也满足。此时的花费为j+min(f[t], j-k-1<=t<j)。
由于k给定,所以这两个最小值(j和t)都可以用单调队列来维护。DP即可,时间复杂度O(n)。
1 |
|