HDU.1529.Cashier Employment(差分约束 最长路SPFA)
\(Description\)
给定一天24h 每小时需要的员工数量Ri,有n个员工,已知每个员工开始工作的时间ti(ti∈[0,23]),每个员工会连续工作8h。
问能否满足一天的需求。若能,输出最少需要多少员工。
\(Solution\)
参考.
既然给的是开始工作时间,那么就先根据开始时间做
设Ai表示在i时开始工作的人数(未知),Bi表示i时可工作人数的上限(已知)
那么有:(注意可以跨天)
A[i-7]+A[i-6]+...+A[i-1]+A[i] >= R[i] (7 <= i < 24)
A[17+i]+A[18+i]+...+A[23]+A[0]+A[1]+...+A[i] >= R[i] (0 <= i < 7)
0 <= A[i] <= B[i]
令S[i]=A[0]+A[1]+...+A[i],规定S[-1]=0,将上边式子转化一下有:
S[i]-S[i-8] >= R[i] (7 <= i < 24)
S[23]-S[16+i]+S[i] >= R[i] (0 <= i < 7)
0 <= S[i]-S[i-1] <= B[i]
观察不等式二,有三个未知数,S[23]是个未知条件,还无法转化为差分约束条件,但只有两个变量与i有关,于是我们对S[23]进行枚举,令S[23]=T
S[i]-S[i-8] >= R[i] (7 <= i < 24)
S[i]-S[16+i] >= R[i]-T (0 <= i < 7)
S[i]-S[i-1] >= 0
S[i-1]-S[i] >= -B[i]
这样就将原问题转化为了求-1 -> 23的最长路
但是还有一个条件,我们令S[23]=T,我们也需要将其转化为不等式,因为S[-1]=0,所以S[23]-S[-1]=T,将其转化为两个不等式
S[23]-S[-1] >= T
S[-1]-S[23] >= -T
若-1 -> 23的最长路=T,那么T就是满足条件的一个解。从小到大枚举 第一个可行的即为答案。
由于员工数量显然是单调的,所以可以二分T (满足条件仍是不存在负环)
注: T(S[23]=A[0]+A[1]+...)的上界是n,not B[23]
为什么都跑0ms啊QAQ
//15MS 1580K
#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=50,M=1e4+5,T=24,INF=0x3f3f3f3f;
int n,B[N],R[N],Enum,H[N],nxt[M],to[M],val[M],dis[N],tm[N];
bool inq[N];
std::queue<int> q;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AddEdge(int u,int v,int w){
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, val[Enum]=w;
}
bool SPFA()
{
for(int i=1; i<=T; ++i) dis[i]=-INF,tm[i]=0;
tm[0]=dis[0]=0, q.push(0);
while(!q.empty())
{
int x=q.front();q.pop();
inq[x]=0;
for(int i=H[x]; i; i=nxt[i])
if(dis[to[i]]<dis[x]+val[i])
{
dis[to[i]]=dis[x]+val[i];
if(!inq[to[i]])
{
if(++tm[to[i]]>T) return 0;
inq[to[i]]=1,q.push(to[i]);
}
}
}
return 1;
}
bool Check(int x)
{
Enum=0, memset(H,0,sizeof H);
for(int i=1; i<8; ++i) AddEdge(16+i,i,R[i]-x);
for(int i=8; i<=T; ++i) AddEdge(i-8,i,R[i]);
for(int i=1; i<=T; ++i) AddEdge(i,i-1,-B[i]),AddEdge(i-1,i,0);
AddEdge(0,T,x), AddEdge(T,0,-x);
return SPFA();
}
int main()
{
int t=read();
while(t--)
{
memset(B,0,sizeof B);
for(int i=1; i<=T; ++i) R[i]=read();
n=read();
for(int i=1; i<=n; ++i) ++B[read()+1];
int l=0,r=n+1,mid;
while(l<r)
if(Check(mid=l+r>>1)) r=mid;
else l=mid+1;
l>n ? puts("No Solution") : printf("%d\n",l);
}
return 0;
}
HDU.1529.Cashier Employment(差分约束 最长路SPFA)的更多相关文章
- [HDU 1529]Cashier Employment(差分约束系统)
[HDU 1529]Cashier Employment(差分约束系统) 题面 有一个超市,在24小时对员工都有一定需求量,表示为\(r_i\),意思为在i这个时间至少要有i个员工,现在有n个员工来应 ...
- POJ.1752.Advertisement(差分约束 最长路SPFA)
题目链接 \(Description\) 有\(n\)个人在一条直线上跑步,每个人的起点 \(Si\).终点 \(Ei\) 已知:每个点可以放一个广告牌,一个人\(i\)能看到的广告牌数量为 \(Ei ...
- 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa
原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...
- hdu 1529 Cashier Employment(差分约束)
Cashier Employment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 【POJ1275】Cashier Employment 差分约束
[POJ1275]Cashier Employment 题意: 超市经历已经提供一天里每一小时需要出纳员的最少数量————R(0),R(1),...,R(23).R(0)表示从午夜到凌晨1:00所需要 ...
- POJ1275/ZOJ1420/HDU1529 Cashier Employment (差分约束)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 题意:一商店二十四小时营业,但每个时间段需求的出纳员不同,现有n个人申请这份工作, ...
- hdu1529 Cashier Employment[差分约束+二分答案]
这题是一个类似于区间选点,但是有一些不等式有三个未知量参与的情况. 依题意,套路性的,将小时数向右平移1个单位后,设$f_i$为前$i$小时工作的人数最少是多少,$f_{24}$即为所求.设$c_i$ ...
- POJ1275 Cashier Employment(差分约束)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9078 Accepted: 3515 Description A sup ...
- HDU1529-Casher Emploryment(最最...最经典的差分约束 差分约束-最长路+将环变线)
A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit its n ...
随机推荐
- k64 datasheet学习笔记3---Chip Configuration之Clock modules
1.前言 本文主要讲述chip configure之clock配置相关的内容,主要包含如下三个部分: MCG configuration:Multipurpose clock generator OS ...
- 利用autocomplete.js实现仿百度搜索效果(ajax动态获取后端[C#]数据)
实现功能描述: 1.实现搜索框的智能提示 2.第二次浏览器缓存结果 3.实现仿百度搜索 <!DOCTYPE html> <html xmlns="http://www.w3 ...
- H3C SNMP OID
有两种mib-style [1]老些的设备 cpu 使用率OID: .1.3.6.1.4.1.25506.2.6.1.1.1.1.6.slot 内存使用率OID: .1.3.6.1.4.1.2550 ...
- 001_深度剖析什么是 SLI、SLO和SLA?
前言 SLO和SLA是大家常见的两个名词:服务等级目标和服务等级协议. 云计算时代,各大云服务提供商都发布有自己服务的SLA条款,比如Amazon的EC2和S3服务都有相应的SLA条款.这些大公司的S ...
- centos6.5报错:checking filesystems failed问题处理
centos系统重启报错:checking filesystems failed checking filesystems /dev/mapper/vg_0-root: 搜了下可能是文件系统损坏 根据 ...
- Web Services基础学习(W3C)
1.Web services 使用 XML 来编解码数据,并使用 SOAP 来传输数据 2.基础的 Web Services 平台是 XML + HTTP. Web services 平台的元素: S ...
- Ex 6_1 和最大的相连子序列..._第五次作业
设数值列表a0,a1 . . . an存放在数组arr[0. . .n]中. sum[0],sum[1],sum[2] . . . .sum[n]为以该下标为终点元素的连续子序列的和的最大值,则sum ...
- 解决sdk更新时候报错 http://dl-ssl.google.com/android上不去,链接拒绝
解决国内访问Google服务器的困难: 启动 Android SDK Manager : 打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - ...
- totastmessage 触发事件后浮框消失的方法
1. 前言 通过查了官放的文档,发现没有 totastmessage 触发事件后,浮框消失的方法,然后通过研究了下点击关闭时的源码,得到了一个的解决方案. 2. 样例代码如下 $("#dro ...
- shell expect权威指南和实战
一.概述 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而expec ...