引用一下POJ的discuss里的大牛的解释。

详细解释一下。
为避免负数,时间计数1~24。令:
R[i] i时间需要的人数 (1<=i<=24)
T[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)这个差分约束有个特殊的地方,(2)的右边有未知数s[24]。
这时可以通过枚举s[24]=ans来判断是否有可行解。
即(2)变形为(2') s[i]-s[16+i]>=R[i]-ans (1<=i<=7)
再通过SPFA求解(1)(2')(3)(4)。不过最后有可能出现这种情况:
(1)(2')(3)(4)虽然有解,但求出的s[24]小于代入(2')里的ans!
这时,显然得到的s[]不满足原来的(2)了(请仔细比较(2)与(2'))。
不过虽然得到的解不满足原方程组,但这并不代表(1)(2)(3)(4)在s[24]=ans时没有可行解!
此外,值得注意的是,当得到的s[24]>ans时,虽然s[24]不一定是最优解,但把ans置成s[24]后,确实是可行解。所以,简单把(2)置换成(2')是有问题的!
为了等价原命题,必须再加上条件:s[24]>=ans
这就是所谓加出来的那条边(5) s[24]-s[0]>=ans最后说一下,SPFA后判dis[24]==ans其实是没有必要的。
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <time.h>
#define maxn 100005
#define maxm 300005
#define eps 1e-10
#define mod 998244353
#define INF 999999999
#define lowbit(x) (x&(-x))
#define mp mark_pair
#define ls o<<1
#define rs o<<1 | 1
#define lson o<<1, L, mid
#define rson o<<1 | 1, mid+1, R
typedef long long LL;
//typedef int LL;
using namespace std;
LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;}
void scanf(int &__x){__x=0;char __ch=getchar();while(__ch==' '||__ch=='\n')__ch=getchar();while(__ch>='0'&&__ch<='9')__x=__x*10+__ch-'0',__ch = getchar();}
// headint h[maxn], next[maxm], v[maxm], cost[maxm];
int inq[maxn], dis[maxn], num[maxn];
int need[maxn], outq[maxn];
queue<int> q;
int n, m, cnt, tot;void read(void)
{int x;memset(num, 0, sizeof num);tot = 0;for(int i = 1; i <= 24; i++) scanf(need[i]);scanf(m);while(m--) scanf(x), num[x+1]++, tot++;
}
void addedges(int u, int vv, int c)
{next[cnt] = h[u], h[u] = cnt, v[cnt] = vv, cost[cnt] = c, cnt++;
}
void build(int x)
{cnt = 0;memset(h, -1, sizeof h);for(int i = 9; i <= 24; i++) addedges(i-8, i, need[i]);for(int i = 1; i < 9; i++) addedges(i+16, i, need[i] - x);for(int i = 1; i <= 24; i++) addedges(i-1, i, 0);for(int i = 1; i <= 24; i++) addedges(i, i-1, -num[i]);for(int i = 0; i <= 24; i++) dis[i] = -INF;for(int i = 0; i <= 24; i++) inq[i] = outq[i] = 0;addedges(0, 24, x);
}
bool spfa(int s)
{while(!q.empty()) q.pop();dis[s] = 0, q.push(s), inq[s] = 1;while(!q.empty()) {int u = q.front(); q.pop(), inq[u] = 0, outq[u]++;if(outq[u] > 26) return false;for(int e = h[u]; ~e; e = next[e])if(dis[u] + cost[e] > dis[v[e]]) {dis[v[e]] = dis[u] + cost[e];if(!inq[v[e]]) q.push(v[e]), inq[v[e]] = 1;}}return true;
}
void work(void)
{int ok = 0, top = tot, bot = 0, res, mid;while(top >= bot) {mid = (top+bot)>>1;build(mid);if(spfa(0)) top = mid-1, res = mid, ok = 1;else bot = mid+1;}if(ok) printf("%d\n", res);else printf("No Solution\n");
}
int main(void)
{int _;while(scanf("%d", &_)!=EOF) {while(_--) {read();work();}}return 0;
}

【差分约束】 HDOJ 1529 Cashier Employment相关推荐

  1. 【POJ - 1275】Cashier Employment(差分约束,建图)

    题干: A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit i ...

  2. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  3. HDU3440(差分约束+SPFA算法)

    题意:两栋房子之间的最大距离为D,也就是A-B<=D,现在求出最矮和最高房子之间的最大距离 思路:差分约束+SPFA算法: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...

  4. HDU1531(差分约束+Bellman_ford)

    题意:给出一个序列Si = {aSi, aSi+1, ..., aSi+ni} 和其子序列S = {a1, a2, ..., an}:在给出序列的约束条件: aSi + aSi+1 + ... + a ...

  5. poj3159(差分约束)

    题意:其实题目要求的就是这个B-A<=c,所以对应单源最短路径中的d[v]>d[u]+e[u][v] 关于差分约束: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...

  6. poj1364(差分约束+Bellman-ford)

    题意:给出一个序列Si = {aSi, aSi+1, ..., aSi+ni} 和其子序列S = {a1, a2, ..., an}:在给出序列的约束条件: aSi + aSi+1 + ... + a ...

  7. poj1201(差分约束+SPFA)

    看到这道题,其实就是和poj1716是差不多的 题意:给出n个闭整数区间[ai,bi]和n个整数C1,.,cn.计算具有区间[ai,bi]的至少ci公共元素的整数集Z的最小大小,对于每一个i=1,2, ...

  8. poj3169(差分约束+SPFA)

    题意:FJ有N头牛,这些牛都站在一条直线上等待,但是现在给出了一些条件: 1.首先列出哪些牛之间彼此喜欢,以及之间的最大距离,也就是A-B<=X 2.随后列出哪些牛之间彼此不喜欢,以及之间的最小 ...

  9. poj1716(差分约束+SPFA)

    题意:整数间隔[a,b],a<b,是以a开头和以b结尾的所有连续整数的集合.在包含至少两个不同整数的集合中找到每个间隔的最小元素数. 思路:采用差分约束算法:当问题可以转化为形如一组 xi‑x' ...

最新文章

  1. AI 复活已故漫画家手冢治虫,出版新作续写传奇
  2. WIX配置(二)-创建快捷方式
  3. 微信小程序发布后,真机调用接口失败:ERR_CERT_AUTHORITY_INVALID
  4. matplotlib 旋转刻度_Matplotlib数据可视化:文本与坐标轴
  5. oracle用命令方式创建表,oracle创建表的方法和一些常用命令
  6. spring cloud+dotnet core搭建微服务架构:配置中心(四)
  7. 微信社交小程序服务器,Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端...
  8. JavaWeb:XML总结
  9. inputstream示例_Java InputStream available()方法与示例
  10. 送给即将春秋招的同学--一名服务端开发工程师的校招面经总结
  11. vs code无法启动怎么解决?
  12. MySQL报错解决方案:2013-Lost connection
  13. 【比赛】CCF BDCI新闻情感分类初赛A榜4/2735,复赛1%题解报告
  14. 通信信号与系统分析(一)
  15. php 开源企业网站,TayCMS 免费开源企业网站建站系统 For PHP v1.8
  16. java.sql.BatchUpdateException: Data truncation: Division by 0
  17. 【编程题】【Scratch二级】2020.12 森林聚会
  18. Winxp U盘无法复制磁盘写保护,如何解决?
  19. 方舟非主机服务器无限距离,方舟生存进化怎么调主机距离
  20. 内网渗透靶场 Vulnstack(二)

热门文章

  1. 适合新手使用的微信编辑器
  2. 承前2021,启后2022
  3. 图的邻接矩阵表示法及顶点入度、出度的计算方法
  4. 图神经网络 | (8)图注意力网络(GAT)
  5. JAVA实现功能的方法
  6. matlab之直方图的绘制
  7. GO语言实现P2P网络-客户端实现并且运行和测试
  8. 求两个整型数的中间值
  9. Python笔记_20_魔术方法
  10. hibernate的环境搭建及使用