· 对于差分约束,题目要求求什么便设什么,令$Sum[i]$表示由$0 ~ i$的雇佣人数。

· 要充分利用题目所给条件,令$Have[i]$表示i时刻申报的人数,$Need[i]$表示i时刻需要的人数「结合 “人数” 关键词」。

此时容易列出两个基本不等式:

    Sum[i] - Sum[i - 1] >= 0;

   Sum[i] - Sum[i - 1] <= Have[i];

此时发现还有$Need[]$和范围为8个单位长度的区间没有使用,可得:

    Sum[i] - Sum[i - 8] >= Need[i]; (i >= 8)

那么还有环形无法处理。

对于环形的处理:

将整个$24$个单位的区间以当前点为分割点,将大区间分割为$(i - 8 + 24)$ ~ $i$ (环形)以及$i$ ~ $i + 16$,相当于覆盖了整个环形区间。

相当于是去限制非当前考虑的完整的区间从而达到限制当前因环形而断开的区间。

所以此时仅需考虑两个区间间的限制即可。

并且需要一个$Sum[- 1]$。

答案显然满足单调性,故考虑二分。

令$mid$表示需要$mid$个服务员。

则可列方程:

    mid - (Sum[i + 16] - Sum[i]) >= Need[i]; (i < 8)

即可解答。

· 代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue> using namespace std; const int MAXN = + ;
const int MAXM = MAXN * ;
const int MAXT = + ; struct LinkedForwardStar {
int to;
int w; int next;
} ; LinkedForwardStar Link[MAXM << ];
int Head[MAXT]= {};
int size = ; void Insert (int u, int v, int w) {
Link[++ size].to = v;
Link[size].w = w;
Link[size].next = Head[u]; Head[u] = size;
} int T; int N; int Have[MAXT];
int Need[MAXN]; int Dist[MAXT];
int Count[MAXT]; queue<int> Que;
bool Inque[MAXT]; bool SPFA (int mid) {
memset (Dist, 0xcf, sizeof (Dist));
memset (Count, , sizeof (Count));
memset (Inque, , sizeof (Inque));
while (! Que.empty())
Que.pop(); Que.push();
Inque[] = true;
Dist[] = ; while (! Que.empty()) {
int u = Que.front();
Que.pop(); Inque[u] = false;
Count[u] ++; if (Count[u] >= )
return false; for (int i = Head[u]; i; i = Link[i].next) {
int v = Link[i].to, w = Link[i].w; if (Dist[u] + w > Dist[v]) {
Dist[v] = Dist[u] + w; if (! Inque[v]) {
Que.push(v);
Inque[v] = true;
}
}
}
} return Dist[] == mid;
} bool Check (int mid) {
memset (Head, , sizeof (Head));
size = ; Insert (, , mid);
Insert (, , );
Insert (, , - Have[]);
for (int i = ; i <= ; i ++) {
Insert (i - , i, );
Insert (i, i - , - Have[i]);
}
for (int i = ; i <= ; i ++)
Insert (i - , i, Need[i]);
for (int i = ; i < ; i ++)
Insert (i + , i, Need[i] - mid); return SPFA (mid);
} int main () {
scanf ("%d", & T); for (int Case = ; Case <= T; Case ++) {
memset (Have, , sizeof (Have)); for (int i = ; i <= ; i ++)
scanf ("%d", & Need[i]); scanf ("%d", & N); for (int i = ; i <= N; i ++) {
int start;
scanf ("%d", & start); Have[start] ++;
} bool flag = false;
int left = , right = N;
while (left < right) {
int mid = (left + right) >> ; if (Check (mid)) {
flag = true;
right = mid;
}
else
left = mid + ;
} if (! flag)
puts ("No Solution");
else
printf ("%d\n", left);
} return ;
} /*
1
1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
5
0
23
22
1
10
*/

POJ - Problem 1275 - 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 its n ...

  2. 图论(差分约束系统):POJ 1275 Cashier Employment

    Cashier Employment Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7651   Accepted: 288 ...

  3. POJ 1275 Cashier Employment(差分约束)

    http://poj.org/problem?id=1275 题意 : 一家24小时营业的超市,要雇出纳员,需要求出超市每天不同时段需要的出纳员数,午夜只需一小批,下午需要多些,希望雇最少的人,给出每 ...

  4. poj 1275 Cashier Employment

    http://poj.org/problem?id=1275 #include <cstdio> #include <cstring> #include <algorit ...

  5. POJ 1275 Cashier Employment 挺难的差分约束题

    http://poj.org/problem?id=1275 题目大意: 一商店二十四小时营业,但每个时间段需求的雇员数不同(已知,设为R[i]),现有n个人申请这份工作,其可以从固定时间t连续工作八 ...

  6. 【POJ 1275】 Cashier Employment(差分约束系统的建立和求解)

    [POJ 1275] Cashier Employment(差分约束系统的建立和求解) Cashier Employment Time Limit: 1000MS   Memory Limit: 10 ...

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

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

  8. hdu 1529 Cashier Employment(差分约束)

    Cashier Employment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. 【POJ1275】Cashier Employment 差分约束

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

随机推荐

  1. hadoop和spark搭建记录

    因玩票需要,使用三台搭建spark(192.168.1.10,192.168.1.11,192.168.1.12),又因spark构建在hadoop之上,那么就需要先搭建hadoop.历经一个两个下午 ...

  2. java利用poi读取excel异常问题

    最近一个web工程需要完成一个小功能,利用文件上传然后读取文件内容写入到数据库,这里是操作的excel文件,excel文件分两种后缀,03版本的xls和之后的xlsx,现在大家一般都拿非常好用的插件直 ...

  3. hbase 安装笔记

    1.安装 在官方镜像站点下载hbase2.0,地址:https://www.apache.org/dyn/closer.lua/hbase/ 解压tar xzvf hbase-2.0.4-bin.ta ...

  4. 《Node入门》读书笔记——用Node.js开发一个小应用

    Android APP的开发告一段落,一个稳定的.实现了基本功能的APP已经交付用户使用了!我和老板交流了下,接下来准备转战Node.js了,而且一部分前端的功能也要做进去!哈哈哈~~~接下来要朝一个 ...

  5. 【JavaScript】面向对象的程序设计

    一.前言        接着上一篇的内容,继续JavaScript的学习. 二.内容 属性类型 //数据属性[Configurable] —— 能否通过delete删除属性从而重新定义属性,能否修改属 ...

  6. acid(数据库事务正确执行的四个基本要素的缩写)

    ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...

  7. Codeforces 585E. Present for Vitalik the Philatelist(容斥)

    好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...

  8. 【BZOJ 2754 喵星球上的点名】

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2512  Solved: 1092[Submit][Status][Discuss] Descript ...

  9. EXT 翻页后查询 页数不重置

    测试查询条件时,当表格翻页后,输入查询条件,页数不刷新,还是之前的页数,导致列表不显示数据.只要在查询时,将表格的currentPage 设为1 即可. store.currentPage = 1; ...

  10. vue2.0 安装及项目搭建(一)

    基本环境安装 1.安装node:从node.js官网下载并安装node.测试:win+R(打开命令行)-------输入cmd-------敲入node -v.如果出现相应版本号,即安装成功: 2.测 ...