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小时营业的超市,需要一批出纳员来满足它的需要.超市经理雇佣你来帮他解决问题:超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多) ...
随机推荐
- poj1064 二分,注意精度!
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35269 Accepted: 7513 Des ...
- QWidget使用qss样式的background-image属性
最近在学习Qt使用QSS样式美化窗口部件的内容.发现在对QWidget应用background-image改变窗口背景图片时,QWidget的窗口背景并未生效.工程建立如下: 1.新建 Qt A ...
- CSS优先级、引入方式、Hack
优先级 important > 内联(1,0,0,0) > id(1,0,0) > class(1,0) > element(1) > *通配符 css引入方式 方式一: ...
- 动态编译添加php模块
注意:转载请注明出处:http://www.programfish.com/blog/?p=85 在很多时候我们用linux里搭建web服务器的时候会需要编译安装php套件,而在编译安装后可能又会需要 ...
- FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令.服务器接收到命令后,会用其本地的FTP数据端口 ...
- NSString 去掉前后空格或回车符
NSString *string = @" spaces in front and at the end "; NSString *trimmedString = [string ...
- C语言读写伯克利DB 4
因为缓存数据的buffer总是不够大(会引起段错误)索性从堆上拿了两块大内存 /* 功能说明:逐日存储来访用户(使用伯克利DB) 根据存储的用户信息确定某用户是否是首次来访用户(未被存储的伯克利DB) ...
- 使用 Mockito 单元测试 – 教程
tanyuanji@126.com 版本历史 - - - - 使用 Mockito 进行测试 该教程主要讲解 Mockito 框架在Eclipse IDE 中的使用 目录 tanyuanji@12 ...
- Unity3D TouchScript 插件教程一
只是个人学习小记,谈不上教程,但是为了命中搜索引擎关键词,只好装逼了:),可能对于大家来说太简单了吧,网上中文教程没搜到 ,只好自己摸索了. 插件资源下载地址:https://www.assetsto ...
- s3c2416裸跑环境配置
最近刚刚开始学习ARM-linux,上周买了块tq2416的板子,给的Linux资料太复杂太深奥不愿看,等不及想要把2416跑起来.于是到处找相关裸跑资料,可是用2416的人实在少,网上的资料更少,裸 ...