转载请注明出处: 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. shell中的双括号表达式

    语法格式 (( expression )) expression可以是任何数学表达式,可以包含的操作符有: +  加 - 减 * 乘(无需转义) / 除 % 取余 ** 指数 == 等于 != 不等 ...

  2. tiny xml 使用总结

    这几天在埋头写自己的3D文件浏览器(稍后发布),突发奇想的要把自己的内部格式转化成XML,于是,把以前在研究所时用过的ExPat翻了出来.ExPat是基于事件的XML解释器,速度挺快的,但结构方面有点 ...

  3. kafka相关应用

    一.kafka官网地址 http://kafka.apache.org 下载地址: http://kafka.apache.org/downloads.html 二.版本 0.9.0.1 is the ...

  4. 函数:Python的乐高积木 - 零基础入门学习Python017

    函数:Python的乐高积木 让编程改变世界 Change the world by program 相信大家小时候应该都玩过神奇的乐高积木,只要通过想象和创意,我们可以用它拼凑出很多神奇的东西. 随 ...

  5. ByteArrayOutputStream的用法

    ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的 ...

  6. 开心菜鸟学习系列学习笔记------------nodejs util公共函数

    global  在最外层定义的变量:    全局对象的属性:    隐式定义的变量(未定义直接赋值的变量).  一.process   process 是一个全局变量,即 global 对象的属性 ...

  7. LibSvm介绍---调用方法及参数介绍

        libsvm是著名的SVM开源组件,目前有JAVA.C/C++,.NET 等多个版本,本人使用的是2.82 libsvm命名空间下主要使用类: svm_model 为模型类,通过训练或加载训练 ...

  8. Shell工具:jsondiff.sh

    逻辑很简单,无非就是通过curl在不同的服务器上取得结果集,然后diff即可,不过这里有几点需要注意的地方:首先,JSON就一行,直接 diff会失去意义:其次,JSON中汉字会被编码,不利于查看:另 ...

  9. dubbo初体验

    最近需要开发部门中某个大数据量的提取的功能,加到了一个ElasticSearch的群.在群里听说到一个框架叫dubbo,阿里系开源软件.听到群友谈的神乎其神的,什么什么功能切分多协议栈,高并发等等等. ...

  10. SxsTrace工具使用方法

    Windows7平台上有一个强大的SxsTrace工具,可以跟踪调试应用程序运行时需要的动态库的版本和路径.   SxsTrace使用的方法:   1.首先必须以Administrator用户身份登录 ...