【POJ1275】Cashier Employment

题意: 超市经历已经提供一天里每一小时需要出纳员的最少数量————R(0),R(1),...,R(23)。R(0)表示从午夜到凌晨1:00所需要出纳员的最少数目;R(1)表示凌晨1:00到2:00之间需要的;等等。每一天,这些数据都是相同的。 有N人申请这项工作,每个申请者i在每天24小时当中,从一个特定的时刻开始连续工作恰好8小时。定义ti(0<=ti<=23)为上面提到的开始时刻,也就是说,如果第i个申请者被录用,他(或她)将从ti时刻开始连续工作8小时。 试着编写一个程序,输入R(i),i=0,...,23,以及ti,i=1,...,N,它们都是非负整数,计算为满足上述限制需要雇佣的最少出纳员数目。

题解:差分约束还是不熟啊

这题的时间是循环的,所以列不等式不是那么容易

设a[i]为每一时刻最少雇佣的收银员数量,b[i]为每一时刻的总申请数,f[i]为0~i时刻实际雇佣的收银员数,根据题目要求并变形,有以下不等式关系: f[i]-f[i-1]≥0   (1<=i<=24)    ——每一时刻雇佣数量大于等于0
f[i]-f[i-1]≤b[i]  (1<=i<=24)  ——每一时刻雇佣数量不超过总申请数
f[i]-f[i-8]≥a[i]  (8<=i<=24)  ——实际雇佣数量满足最小需求

f[i]-f[i+16]≥a[i]-f[24]  (1<=i<=7)    ——实际雇佣数量满足最小需求,注意i可能跨天

但是f[24]也是个变量,所以我们令ans=f[24],然后枚举ans,用SPFA判负环就好了

这样做会不会有什么问题?

问题在于f[i]-f[i+16]≥a[i]-f[24]和f[i]=f[i+16]≥a[i]-ans这两个不等式并不等价,前者对变量f[24]也具有一定限制,而后者将其省略掉了。所以,我们只需要令f[24]=ans,就能将错解排除掉,具体地,f[24]≥ans就可以

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
int n,cnt;
int len[1010],dis[1010],to[1010],next[1010],head[1010],val[1010];
int inq[1010],s[1010],r[1010];
queue<int> q;
void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
int spfa(int ans)
{
int u,i;
for(i=1;i<=7;i++) val[head[i]]=ans-r[i];
val[head[24]]=-ans;
memset(dis,0x3f,sizeof(dis));
memset(len,0,sizeof(len));
while(!q.empty()) q.pop();
for(i=0;i<=24;i++) q.push(i),dis[i]=len[i]=0,inq[i]=1;
while(!q.empty())
{
u=q.front(),q.pop(),inq[u]=0;
for(i=head[u];i!=-1;i=next[i])
{
if(dis[to[i]]>dis[u]+val[i])
{
dis[to[i]]=dis[u]+val[i];
len[to[i]]=len[u]+1;
if(len[to[i]]>25) return 0;
if(!inq[to[i]])
{
inq[to[i]]=1;
q.push(to[i]);
}
}
}
}
return 1;
}
void work()
{
int i,j,a;
for(i=1;i<=24;i++) scanf("%d",&r[i]);
scanf("%d",&n);
cnt=0;
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++) scanf("%d",&a),s[a+1]++;
for(i=1;i<=24;i++) add(i-1,i,s[i]),add(i,i-1,0);
for(i=8;i<=24;i++) add(i,i-8,-r[i]);
for(i=1;i<=7;i++) add(i,i+16,0);
add(24,0,0);
for(i=1;i<=n;i++)
{
if(spfa(i))
{
printf("%d\n",i);
return ;
}
}
printf("No Solution\n");
}
int main()
{
int T;
scanf("%d",&T);
while(T--) work();
return 0;
}

【POJ1275】Cashier Employment 差分约束的更多相关文章

  1. POJ1275 Cashier Employment(差分约束)

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

  2. POJ1275/ZOJ1420/HDU1529 Cashier Employment (差分约束)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 题意:一商店二十四小时营业,但每个时间段需求的出纳员不同,现有n个人申请这份工作, ...

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

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

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

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

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

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

  6. Cashier Employment 差分约束

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

  7. 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 ...

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

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

  9. POJ1275 Cashier Employment 【二分 + 差分约束】

    题目链接 POJ1275 题解 显然可以差分约束 我们记\(W[i]\)为\(i\)时刻可以开始工作的人数 令\(s[i]\)为前\(i\)个时刻开始工作的人数的前缀和 每个时刻的要求\(r[i]\) ...

随机推荐

  1. sql server服务看不到,显示为远程过程调用在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误10061

    需要启动sql server服务 启动就可以完成登录了

  2. numpy和matplotlib绘制直方图

    使用 Matplotlib Matplotlib 中有直方图绘制函数:matplotlib.pyplot.hist()它可以直接统计并绘制直方图.你应该使用函数 calcHist() 或 np.his ...

  3. Spring IOC和AOP 基础

    1 spring中注入资源是通过描述来实现的,在 spring 中是通过注解或者 XML 描述.spring 中IOC 注入方式有三种 1)构造方法注入 2)setter 注入 3)接口注入 1.1) ...

  4. EasyUI combobox的panelHeight自动高度

    在使用EasyUI的时候,有时会用到combobox组件,这里的记录数不是很固定,设置为auto可能会被挡住,设置固定高度时,option很少时,也很丑 所以这里给出我自己自动调整combobox的p ...

  5. 详解登录认证及授权--Shiro系列(一)

    Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密.Apache Shiro 的首要目标是易于使用和理解.安全有时候是很复杂的,甚至是痛苦的, ...

  6. INFORMIX的dbexport和dbimport使用示例说明

    INFORMIX-IDS数据库进行迁移中,我们在进行数据级别的迁移时,采用dbexport,dbimport来完成.dbexport导出数据库中所有对象的模式脚本和表数据文件,该模式脚本中包含有表等的 ...

  7. sql server 列修改null 变成not null

    ALTER TABLE [table_name] ALTER COLUMN [column_name] [datetime] NOT NULL --datetime是列的类型

  8. CSS3边框圆角知识

    <div class="item" data-brief="整圆"> <div class="border-radius" ...

  9. Ubuntu 给应用程序添加桌面图标(本文以Eclipse为例)

    这里以Eclipse为例: eclipse是下载的是解压就能用的,但是没有桌面图标就显得很无力了. 自己写了一个eclipse.desktop放到/usr/share/applications/目录下 ...

  10. cf 450c Jzzhu and Chocolate

    Jzzhu and Chocolate time limit per test 1 second memory limit per test 256 megabytes input standard ...