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小时营业的超市,需要一批出纳员来满足它的需要.超市经理雇佣你来帮他解决问题:超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多) ...
随机推荐
- shell中的循环语句
for语法格式 for var in list;do commands done 其中list可以包含: 1) 直接写 for alpha in a b c d;do echo $alpha done ...
- apache将请求转发到到tomcat应用
映射: 1.开启apache中的proxy模块(proxy.conf,proxy.load,proxy_http.load) 2.配置apache配置文件,<VirtualHost *:80&g ...
- Python网络编程踩的坑
错误:socket.error: [Errno 10013] 原因:端口号被占用 解决:换其他的端口号或者将其他应用的端口号关闭 错误:File "D:/pyworkspace/homewo ...
- getResources().getXml()获取xml
获取XML文件的基本思路是,通过getResources().getXml()获的XML原始文件,得到XmlResourceParser对象,通过该对象来判断是文档的开头还是结尾,是某个标签的开始还是 ...
- DataGrid导出excel
DAL://产品信息导出——LPH public DataTable ExportRelease(string type) { string sql = "SELECT [ProductID ...
- 《Programming WPF》翻译 第3章 1.什么是控件
原文:<Programming WPF>翻译 第3章 1.什么是控件 对于一个应用程序而言,控件是搭建用户界面的积木.它们具备交互式的特征,例如文本框.按钮以及列表框.尽管如此,WPF还有 ...
- WebApi 能支持Session
由于项目实际需要,我希望让WebApi服务也能支持Session,所以便查找资料按照网上的方法开始着手实验. 然后就有了以下的代码,主要是说让WebApi支持Session,要重写Global.asa ...
- 关于在C#中实现AOP 拦截编程模式的新的探索
前面有篇文章,是从其他个人博客中贴过来的.地址:http://www.lanhusoft.com/Article/240.html 作者总结实现的挺好. 但是.不能不考虑性能!!使用 ContextB ...
- 杭电1142(最短路径+dfs)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- nodejs 设置网络代理
在使用nodejs的过程中,加入使用代理上网,那么安装组件会失败,此时配置代理即可,命令如下: [root@oracle ~]#npm config set proxy=http://10.101.1 ...