题意:
一家24小时营业的超市,需要雇佣一些出纳员来满足需求。超市在不同时刻需要不同数目的出纳员,记为ri (0 <= i <= 23).
有n个人来申请职位,一旦雇佣一个人,他将从一个时刻ti开始,连续工作8小时。
输入ri和ti,求满足需求最少需要雇佣多少人。
思路:
设r[i]为每小时需要的出纳员数目,
t[i]为每小时应征者的数目,
s[i]为从时刻0到时刻i雇佣的出纳员总数,
sum为雇佣的所有出纳员总数。
可以推出:
s[i] - s[i - 1] >= 0,
s[i - 1] - s[i] >= -t[i],
s[i] - s[i - 8] >= r[i],
s[i] - s[i + 16] >= r[i] - s[23],
s[23] - s[-1] >= sum
从小到大枚举sum,如果存在s[a] - s[b] >= c,就从b向a连一条权为c的边,以-1为源点求一次最短路,如果不存在负权环则记录答案。
代码(720K,157MS):
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
stru