题目:http://poj.org/problem?id=1275

做的第一道差分约束题...

首先,根据题意得出一些不等关系(f为前缀和雇佣人数):

0 <= f[i] - f[i-1] <= t[i];      // 雇佣的人数少于申请者但不能为负数
f[i] - f[i-8] >= r[i]              // 当x>=8时,该方程成立,否则将出现负数显然不成立
f[i-8+24] - f[i] <= x - r[i]   // 当x<8时,由于昨天的雇人可以通宵上班,因此这个约束通过反面处理
f[24] - f[0] >= x              // 最后24小时内雇佣人应该大于等于x个人

其中x是一个需要二分的变量,也就是最终雇佣了多少人;

而最后一个条件,可以看做是强制选x个人,那么即使实际上雇佣了小于x的人,spfa结果仍为(-)x,这样可以来判断x是否为可行解;

千辛万苦终于AC,最后迟迟难A的问题竟然是spfa中没有给vis数组赋0!这是习惯错误,因为这个spfa与平常不同的是有中途return 0,所以可能没有把vis全赋会0就退出,所以每次需要重新赋0。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
int const MAXN=;
int T,n,r[MAXN],t[MAXN],ct,head[MAXN],L,R,dis[MAXN],cnt[MAXN];
bool vis[MAXN];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[MAXN*];
bool spfa(int x)
{
while(q.size())q.pop();
memset(dis,0x3f,sizeof dis);
memset(cnt,,sizeof cnt);
memset(vis,,sizeof vis);//!!!
int s=;
q.push(s);vis[s]=;dis[s]=;cnt[s]=;
//根据加边看到应该从后往前走,从-x人出发,dis为负
while(q.size())
{
int x=q.front();q.pop();vis[x]=;
if(cnt[x]>)return ;//若入队>25次,可判断存在负环
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(dis[u]>dis[x]+edge[i].w)
{
dis[u]=dis[x]+edge[i].w;
if(!vis[u])vis[u]=,q.push(u),cnt[u]++;
}
}
}
return dis[]==-x;//是否的确雇佣了x个人(没有被边限制卡掉)
}
bool pd(int x)
{
ct=;
memset(head,,sizeof head);
for(int i=;i<;i++)
{
edge[++ct]=N(i+-,head[i],x-r[i]);head[i]=ct;
edge[++ct]=N(i,head[i-],t[i]);head[i-]=ct;
edge[++ct]=N(i-,head[i],);head[i]=ct; }
for(int i=;i<=;i++)
{
edge[++ct]=N(i-,head[i],-r[i]);head[i]=ct;
edge[++ct]=N(i,head[i-],t[i]);head[i-]=ct;
edge[++ct]=N(i-,head[i],);head[i]=ct;
}
edge[++ct]=N(,head[],-x);head[]=ct;//!f[24]-f[0]>=x
return spfa(x);
}
int main()
{
scanf("%d",&T);
while(T--)
{
for(int i=;i<=;i++)
scanf("%d",&r[i]);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
t[x+]++;//从1~24计算
}
L=;R=n;
int ans=-;
while(L<=R)
{
int mid=((L+R)>>);
if(pd(mid))ans=mid,R=mid-;
else L=mid+;
}
if(ans!=-)printf("%d\n",ans);
else printf("No Solution\n");
}
return ;
}

poj1275收银员——差分约束的更多相关文章

  1. 【POJ1275】Cashier Employment 差分约束

    [POJ1275]Cashier Employment 题意: 超市经历已经提供一天里每一小时需要出纳员的最少数量————R(0),R(1),...,R(23).R(0)表示从午夜到凌晨1:00所需要 ...

  2. 湖南附中模拟day1 收银员

    4.1 题意描述花花家的超市是 24 小时营业的,现在需要招聘收银员.超市每个小时都需要不同数量的收银员,用 ai 表示一天中 i 点到 i + 1 点这一小时内需要的收银员数量,特别地 a23 表示 ...

  3. 【NOIP模拟赛】收银员(一道差分约束好题)

    /* s[]表示最优方案的序列中的前缀和,那么s[23]就是最优方案 由题意我们可以列出这样一些式子: s[i]+s[23]-s[16+i]>=a[i] (i-8<0) s[i]-s[i- ...

  4. Acwing 393. 雇佣收银员

    算法1: 差分约束 + 枚举 O(Tn2028) 由于牵扯到 \([i - 8 + 1, i]\) 这段区间的和的约束,所以用前缀和更好表达一些. 设 \(num[i]\)表示 \(i\) 时刻有多少 ...

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

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

  6. 移动零售批发行业新的技术特色-智能PDA手持移动扫描打印销售开单收银仪!!

    提起便利店或者超市,大家的第一印象一定是前台那个笨重的POS机和站在POS机后的收银员.传统的零售店中,笨重的POS机随处可见. 变革前,零售盘点多烦忧 一个顾客要结账,就需要通过POS机.小票打印机 ...

  7. C++ 大作业 超市收银系统

    #include<iostream> #include<fstream> #include<string> #include<iomanip> #inc ...

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

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

  9. POJ1275出纳员的雇佣【差分约束】

    出纳员的雇佣 Tehran的一家每天24小时营业的超市,需要一批出纳员来满足它的需要.超市经理雇佣你来帮他解决问题:超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多) ...

随机推荐

  1. nexus启动报错-----&gt;错误 1067: 进程意外终止。

    1.今天启动nexus报错: 2.错误信息 错误 1067: 进程意外终止. 3.检查发现我之前把jdk升级了. 然而nexus之前指定的jdk将不再生效. 4.解决的方法 找到nexus安装文件夹 ...

  2. C++11 并发指南一(C++11 多线程初探)(转)

    引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...

  3. overflow滚动条样式设置,ie和webkit内核

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 怎样把多个Android Project打包成一个APK

    怎样把多个Android Project打包成一个APK(你的项目怎样引用其它项目). 怎样把多个android project 打包成一个apk呢,事实上原理是这种.一个主project引用其它的p ...

  5. 修改host文件原理 localhost,127.0.0.1之间有什么区别

    修改host文件原理http://www.zhihu.com/question/19782572 localhost与127.0.0.1的区别是什么 相信有人会说是本地ip,曾有人说,用127.0.0 ...

  6. 浅谈PropertyChanged是如何被初始化的?

    http://www.cnblogs.com/wpcockroach/p/3909081.html

  7. Spring Boot 测试时的日志级别

    1.概览 该教程中,我将向你展示:如何在测试时设置spring boot 日志级别.虽然我们可以在测试通过时忽略日志,但是如果需要诊断失败的测试,选择正确的日志级别是非常重要的. 2.日志级别的重要性 ...

  8. IOS 汤姆猫核心代码

    // // MJViewController.m // 03-Tom // // Created by apple on 13-11-24. // Copyright (c) 2013年 itcast ...

  9. Xcode5.1.1+ios 7.1.2 免证书真机调试

    Xcode假设不破解.无法真机调试, 也无法编译真机Release文件.仅仅有付费开通Apple开发人员账号,才干申请真机调试.而Xcode进行破解后,结合越狱的iPhone或iPad, 就可以免官方 ...

  10. 零基础学python-2.18 异常

    这一节说一下异常except 继续沿用上一节的代码.我有益把文件名称字搞错.然后在结尾部分加上异常捕捉: try: handler=open("12.txt")#在这里我特别将文件 ...