POJ1275/ZOJ1420/HDU1529 Cashier Employment (差分约束)
转载请注明出处: 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 (差分约束)的更多相关文章
- hdu1529 Cashier Employment[差分约束+二分答案]
这题是一个类似于区间选点,但是有一些不等式有三个未知量参与的情况. 依题意,套路性的,将小时数向右平移1个单位后,设$f_i$为前$i$小时工作的人数最少是多少,$f_{24}$即为所求.设$c_i$ ...
- 【POJ1275】Cashier Employment 差分约束
[POJ1275]Cashier Employment 题意: 超市经历已经提供一天里每一小时需要出纳员的最少数量————R(0),R(1),...,R(23).R(0)表示从午夜到凌晨1:00所需要 ...
- POJ1275 Cashier Employment(差分约束)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9078 Accepted: 3515 Description A sup ...
- HDU.1529.Cashier Employment(差分约束 最长路SPFA)
题目链接 \(Description\) 给定一天24h 每小时需要的员工数量Ri,有n个员工,已知每个员工开始工作的时间ti(ti∈[0,23]),每个员工会连续工作8h. 问能否满足一天的需求.若 ...
- Cashier Employment 差分约束
题意:有一个超市需要一些出纳员,已给出这个超市在各个时间段(0-1,1-2,2-3...共24个时间段)至少需要的出纳员数目,现在前来应聘有n个人,每个人都有一个固定的开始工作的时间,这也意味着从这个 ...
- 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 ...
- [HDU 1529]Cashier Employment(差分约束系统)
[HDU 1529]Cashier Employment(差分约束系统) 题面 有一个超市,在24小时对员工都有一定需求量,表示为\(r_i\),意思为在i这个时间至少要有i个员工,现在有n个员工来应 ...
- POJ1275 Cashier Employment[差分约束系统 || 单纯形法]
Cashier Employment Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7997 Accepted: 305 ...
- POJ1275出纳员的雇佣【差分约束】
出纳员的雇佣 Tehran的一家每天24小时营业的超市,需要一批出纳员来满足它的需要.超市经理雇佣你来帮他解决问题:超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多) ...
随机推荐
- POJ 1011 - Sticks DFS+剪枝
POJ 1011 - Sticks 题意: 一把等长的木段被随机砍成 n 条小木条 已知他们各自的长度,问原来这些木段可能的最小长度是多少 分析: 1. 该长度必能被总长整除 ...
- hdu 验证角谷猜想 1279
Problem Description 数论中有许多猜想尚未解决,其中有一个被称为"角谷猜想"的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何 ...
- (原).cc 和 .cpp 后缀结尾的文件的区别
This caused a few problems the first time C++ was ported to a system where case wasn't significant i ...
- HTML5音频
<audio>用来播放声音文件. 案例1: <!DOCTYPE html><html><head lang="en"> <me ...
- lnmp安装fileinfo扩展
1.错误: PHP Fileinfo extension must be installed/enabled to use Intervention Image. 2.原因: 缺少 fileinfo扩 ...
- Trucking(HDU 2962 最短路+二分搜索)
Trucking Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 2014年总结:我的IT路
又是一年春节时,转眼之间已经毕业4年,简单回顾一下这几年的职业生涯,希望大家提出宝贵意见. 大学时,几个同学跟着学校网络中心的老师一块做校园网上运行的小系统.偶尔协助一下老师对学校机房.校园网做一下维 ...
- IC封装形式COF介绍
其实这个真不太懂,没有太多接触也没有比较好的资料,只能简单的了解一下了. 什么是卷带式覆晶薄膜封装 COF(Chip on film) COF是一种 IC 封装技术,是运用软性基板电路(flexibl ...
- Altium designer PCB king (收录各种版本)
不要再留念protel99se这么古老的PCB软件了,宝刀也经不起岁月的磨练. 相比Altium Designer,protel99se逊色多了.虽然很多人还是用这把已经快老的刀.作为新时代的新人,我 ...
- 在Visual Studio Express 2013中开发自定义控件
在专业版本中,新建项目时有"Windows Control Library"这样一个类型可以用于新建自定义控件项目. 但是Express版本中,没有这样一个类型可供选择.这里有另外 ...