1275 -- Cashier Employment -
POJ
1420
Cashier Employment – ZOJ
U133833 店主的困惑
(Puzzlement of Merchant) - 洛谷 计算机科学教育新生态
其中 POJ 和洛谷数据较为全面,建议使用 POJ 或洛谷提交。数据强度 洛谷 > POJ > ZOJ 。
本题解以洛谷平台数据为准。
题目大意
有 \(T\) 组数据。店主要雇佣一部分店员。对于一天中的第 \(i\) 小时,店主需要 \(D_i\) 个店员工作。对于 \(n\) 个店员,每个店员会从 \(t_i\) 的时间内开始工作,连续工作 \(8\) 个小时。请问最少雇佣的店员的数量。
其中 \(1 \leqslant T \leqslant 1000\) , \(0 \leqslant D_i \leqslant 1000\) , \(0 \leqslant n \leqslant 10000\) , \(1 \leqslant t_i \leqslant 24\) 。
算法选择
可以轻易构建出不等式,并求极值。选择差分约束。关于差分约束,见下。
算法分析
对于原题中的 \(t_i\) ,统计成为 \(P_i\) ,其中 \(P_i\) 代表第 \(i\) 个小时来应聘的人数。设第 \(i\) 个小时录用的人数为 \(A_i\) 。
接下来,对 \(P_i\) , \(A_i\) 和 \(D_i\) 进行分析,并推导约束条件。
首先,对于每个时刻,录取的人数应小于等于前来应聘的人数。故有 \(A_i \leqslant P_i\) 。
其次,对于每个时刻,工作的人数应大于等于店长的需求。即对于第 \(i\) 个小时,此小时及前 \(7\) 个小时录用的人员之和应该大于等于 \(D_i\) 。假设正在分析第 \(i\) 个小时。则当 \(i \geqslant 8\) 时,只要
\[A_{i-7} + A_{i-6} + \cdots + A_i \geqslant P_i\]
即可满足。当 \(1 \leqslant i \leqslant 7\) 时,只要
\[A_1 + A_2 + \cdots + A_i + A_{i +17} +A_{i + 18} + \cdots + A_{24} \geqslant P_i\]
时,即可满足。
为化为差分约束所需形式,设 \(S_i\) = \(A_1 + A_2 + \cdots + A_i\) 且 \(S_0 = 0\) ,则上面的算式可总结为
\[\left\{ \begin{aligned}S_{i -1} \ - S_i&\geqslant -P_i &(1 \leqslant i \leqslant 24) \\ S_i \ - S_{i-1}&\geqslant 0 &(1 \leqslant i \leqslant 24) \\ S_i \ - S_{i-8}&\geqslant D_i &(8 \leqslant i \leqslant 24) \\ S_i \ - S_{i + 16}&\geqslant D_i \ - S_{24} &(1 \leqslant i \leqslant 7)\end{aligned}\right.\]
但是考虑到 \(S_{24}\) 为未知量,考虑枚举 \(S_{24}\) 并对每个枚举进行差分约束。假设目前枚举至 \(cur\) ,则上方程组的最后一个方程可以转化为
\[S_i \ - S_{i + 16} \geqslant D_i \ - cur\]
但是此方程与原方程组的最后一个方程不能够等价替代。考虑根据此方程计算出的 \(S_{24}\) 与枚举的 \(cur\) 的关系,不妨直接增加差分约束条件 \(S_{24} = cur\) ,这样若是在枚举 \(cur\) 时存在可行解,则差分约束系统一定会给出一可行解;若是对于 \(cur\) 不存在可行解,则一定会有不等式互相矛盾,即图中有正环存在。根据此性质,我们可以在 \(0\) 到 \(n\) 范围内二分 \(cur\) 。
至此,所有的约束条件已经推导出,在此列举出来。
\[\left\{ \begin{aligned}S_{i -1} \ - S_i&\geqslant -P_i &(1 \leqslant i \leqslant 24) \\ S_i \ - S_{i-1}&\geqslant 0 &(1 \leqslant i \leqslant 24) \\ S_i \ - S_{i-8}&\geqslant D_i &(8 \leqslant i \leqslant 24) \\ S_i \ - S_{i + 16}&\geqslant D_i \ - cur &(1 \leqslant i \leqslant 7) \\ S_{24} &= cur\end{aligned}\right.\]
代码实现
测试点用时最长约 700ms 。
1 |
|
参考资料
- 冯威《数与图的完美结合——浅析差分约束系统》
- 1755 【差分约束】Cashier Employment(出纳员的雇佣) - 百度文库