转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud

题意:一商店二十四小时营业,但每个时间段需求的出纳员不同,现有n个人申请这份工作,其可以从固定时间t连续工作八个小时,问在满足需求的情况下最小需要多少个出纳

一道十分经典的差分约束题目,在构图上稍有难度

为避免负数,时间计数1~24。

令:

r[i]表示i时间需要的人数 (1<=i<=24)

num[i]表示i时间应聘的人数 (1<=i<=24)

x[i]表示i时间录用的人数 (0<=i<=24),其中令x[0]=0

再设s[i]=x[0]+x[1]+……+x[i] (0<=i<=24),

由题意,可得如下方程组:

(1) s[i]-s[i-8]>=R[i] (8<=i<=24)

(2) s[i]-s[16+i]>=R[i]-s[24] (1<=i<=7)

(3) s[i]-s[i-1]>=0 (1<=i<=24)

(4) s[i-1]-s[i]>=-T[i] (1<=i<=24)

这样就得到了四个相同形式的大于等于方程组,我们只需要枚举s[24]即可处理。可以使用二分优化。

ps:对于A-B>=C的方程,即连一条从B至A的权值为C的有向边。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define REP(A,X) for(int A=0;A<X;A++)
using namespace std;
#define INF 0x7fffffff
#define MAXN 10010
struct node{
int v,d,next;
}edge[MAXN];
int head[];
int inihead[];
int e=;
void init()
{
e=;
REP(i,)head[i]=-;
}
void add_edge(int u,int v,int d)
{
edge[e].v=v;
edge[e].d=d;
edge[e].next=head[u];
head[u]=e;
e++;
}
int dis[MAXN];
int vis[MAXN];
int cnt[MAXN];
int r[MAXN];
int num[MAXN];
int spfa(int mid){
REP(i,)vis[i]=;
REP(i,)dis[i]=-INF;
REP(i,)cnt[i]=;
queue<int>q;
q.push();
vis[]=;
cnt[]++;
dis[]=;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x];i!=-;i=edge[i].next)
{
int y=edge[i].v;
int d=edge[i].d;
if(dis[y]<dis[x]+d)
{
dis[y]=dis[x]+d;
if(!vis[y])
{
q.push(y);
vis[y]=;
cnt[y]++;
if(cnt[y]>)return false;
}
}
}
vis[x]=;
}
return ; } int main()
{
ios::sync_with_stdio(false);
//freopen("in.in","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
REP(i,)scanf("%d",&r[i+]);
int n;
int a;
scanf("%d",&n);
REP(i,)num[i+]=;
REP(i,n){
scanf("%d",&a);
num[a+]++;
}
init();
for(int i=;i<=;i++){
if(i>)add_edge(i-,i,r[i]);
add_edge(i,i-,-num[i]);
add_edge(i-,i,);
}
int tempe=e;
REP(i,)inihead[i]=head[i];
int x=,y=n;
int ans=INF;
while(x<y)
{
e=tempe;
int mid=(x+y)/;
REP(i,) head[i]=inihead[i];
for(int i=;i<;i++) add_edge(i+,i,r[i]-mid);
add_edge(,,mid);
if(spfa(mid)){
y=mid;
ans=min(mid,ans);
}
else{
x=mid+;
}
}
if(ans>n)printf("No Solution\n");
else printf("%d\n",ans);
}
return ;
}

代码君

POJ1275/ZOJ1420/HDU1529 Cashier Employment (差分约束)的更多相关文章

  1. hdu1529 Cashier Employment[差分约束+二分答案]

    这题是一个类似于区间选点,但是有一些不等式有三个未知量参与的情况. 依题意,套路性的,将小时数向右平移1个单位后,设$f_i$为前$i$小时工作的人数最少是多少,$f_{24}$即为所求.设$c_i$ ...

  2. 【POJ1275】Cashier Employment 差分约束

    [POJ1275]Cashier Employment 题意: 超市经历已经提供一天里每一小时需要出纳员的最少数量————R(0),R(1),...,R(23).R(0)表示从午夜到凌晨1:00所需要 ...

  3. POJ1275 Cashier Employment(差分约束)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9078   Accepted: 3515 Description A sup ...

  4. HDU.1529.Cashier Employment(差分约束 最长路SPFA)

    题目链接 \(Description\) 给定一天24h 每小时需要的员工数量Ri,有n个员工,已知每个员工开始工作的时间ti(ti∈[0,23]),每个员工会连续工作8h. 问能否满足一天的需求.若 ...

  5. Cashier Employment 差分约束

    题意:有一个超市需要一些出纳员,已给出这个超市在各个时间段(0-1,1-2,2-3...共24个时间段)至少需要的出纳员数目,现在前来应聘有n个人,每个人都有一个固定的开始工作的时间,这也意味着从这个 ...

  6. poj 1275 Cashier Employment - 差分约束 - 二分答案

    A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit its n ...

  7. [HDU 1529]Cashier Employment(差分约束系统)

    [HDU 1529]Cashier Employment(差分约束系统) 题面 有一个超市,在24小时对员工都有一定需求量,表示为\(r_i\),意思为在i这个时间至少要有i个员工,现在有n个员工来应 ...

  8. POJ1275 Cashier Employment[差分约束系统 || 单纯形法]

    Cashier Employment Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7997   Accepted: 305 ...

  9. POJ1275出纳员的雇佣【差分约束】

    出纳员的雇佣 Tehran的一家每天24小时营业的超市,需要一批出纳员来满足它的需要.超市经理雇佣你来帮他解决问题:超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多) ...

随机推荐

  1. NDK编译Python2.7.5

    [背景] 网上有一些ndk编译python的做法,但按照教程做总是不成功,可能是环境版本不一样,导致很多地方的配置都不成功. 网上的教程大多只有做法,没有解释,即使按照教程编译成功,很多细节都不知道为 ...

  2. arm汇编(c内嵌汇编及c和汇编互调)

    C语言编译成汇编: arm-linux-gcc -S test.c -o test.S C语言编译成可执行文件: arm-linux-gcc test.c -o test 多个文件编译链接: arm- ...

  3. VC++函数(win32_exe)

    1.windows输出,以对话框的方式. int MessageBox( HWND hWnd, // handle to owner window LPCTSTR lpText, // text in ...

  4. 帝国cms7.0整合百度编辑器ueditor教程

    帝国cms7.0整合百度编辑器ueditor教程开始 1.根据自己使用的帝国cms版本编码下载对应的ueditor版本 下载地址 http://ueditor.baidu.com/website/do ...

  5. 让WordPress的作者在后台只能看到自己的文章

    今天需要对WordPress后台进行调整,目的是为了只能让当前用户看见自己所发表的文章,而WordPress默认是登陆用户可以看到所有用户发表的文章. WordPress中的用户角色分的比较详细,作者 ...

  6. php跨服务器传递对象

    最近因为研究跨域名,跨服务器的问题,所以无聊,就想到了一个跨服务器传递对象的问题. 想要跨服务器传递数据,那么就要使用到get或者post提交. 我这里的方法有点复杂,但是因为平时工作时,有封装相应的 ...

  7. POJ 2653 Pick-up sticks(线段相交)

    题意:给定n个木棍依次放下,要求最终判断没被覆盖的木棍是哪些. 思路:快速排斥以及跨立实验可以判断线段相交. #include<algorithm> #include<cstdio& ...

  8. Ceph:一个开源的 Linux PB 级分布式文件系统

    探索 Ceph 文件系统和生态系统 M. Tim Jones , 自由作家 简介:  Linux®持续不断进军可扩展计算空间,特别是可扩展存储空间.Ceph 最近才加入到 Linux 中令人印象深刻的 ...

  9. Linux配置完iptables后,重启失效的解决方案

    Linux配置完iptables后,重启失效的解决方案 因为只有root用户才可访问1024以下的端口,非root用户登陆是不能启用80端口的.web service 往往启动1024以上的端口,并通 ...

  10. NSIS脚本根据操作系统版本动态决定默认安装目录

    问题描述: 因为windows XP和windows 7的program files不同(有program files(x86)),所以需要动态根据系统的位数设置默认安装目录 References: ...