POJ - Problem 1275 - Cashier Employment
· 对于差分约束,题目要求求什么便设什么,令$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的更多相关文章
- 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 ...
- 图论(差分约束系统):POJ 1275 Cashier Employment
Cashier Employment Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7651 Accepted: 288 ...
- POJ 1275 Cashier Employment(差分约束)
http://poj.org/problem?id=1275 题意 : 一家24小时营业的超市,要雇出纳员,需要求出超市每天不同时段需要的出纳员数,午夜只需一小批,下午需要多些,希望雇最少的人,给出每 ...
- poj 1275 Cashier Employment
http://poj.org/problem?id=1275 #include <cstdio> #include <cstring> #include <algorit ...
- POJ 1275 Cashier Employment 挺难的差分约束题
http://poj.org/problem?id=1275 题目大意: 一商店二十四小时营业,但每个时间段需求的雇员数不同(已知,设为R[i]),现有n个人申请这份工作,其可以从固定时间t连续工作八 ...
- 【POJ 1275】 Cashier Employment(差分约束系统的建立和求解)
[POJ 1275] Cashier Employment(差分约束系统的建立和求解) Cashier Employment Time Limit: 1000MS Memory Limit: 10 ...
- POJ1275 Cashier Employment[差分约束系统 || 单纯形法]
Cashier Employment Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7997 Accepted: 305 ...
- hdu 1529 Cashier Employment(差分约束)
Cashier Employment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 【POJ1275】Cashier Employment 差分约束
[POJ1275]Cashier Employment 题意: 超市经历已经提供一天里每一小时需要出纳员的最少数量————R(0),R(1),...,R(23).R(0)表示从午夜到凌晨1:00所需要 ...
随机推荐
- MethodHandle
JDK7为间接调用方法引入新的API,在java.lang.invoke包下,可以看作为反射的升级版,但它不像反射API那样显得冗长.繁重 主要的类 MethodHandle 方法句柄.对可直接执行的 ...
- 【HLSDK系列】HL引擎入门篇
如果你打算拿HL的源码(也就是HLSDK)来改出一个自己的游戏,那你就非常有必要理解一些HL引擎的工作方式. HL引擎分成两个部分,服务端和客户端.服务端管理所有玩家的状态和游戏规则,客户端负责显示U ...
- C++解析(28):异常处理
0.目录 1.C语言异常处理 2.C++中的异常处理 3.小结 1.C语言异常处理 异常的概念: 程序在运行过程中可能产生异常 异常(Exception)与 Bug 的区别 异常是程序运行时可预料的执 ...
- BZOJ4152:[AMPPZ2014]The Captain——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4152 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1 ...
- 【BZOJ】2956:模积和
Time Limit: 10 Sec Memory Limit: 128 MB Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j ...
- ctsc2009 移民站选址
分析:非常非常好的一道题! 首先需要对问题进行转化: 行列无关,对于行单独处理,对于列单独处理 必然存在一个最优方案使得每一个新站与旧站重合. 转化1很显然,对于转化2,是一类非常经典的“中位数问题” ...
- flask学习之解决Internal Server Error问题的方式之一
最近在学习flask web development的时候,遇到了这么一个问题,就是照着书上敲的代码,跑起来是Internal server error,由于中途学的时候为了方便,改用pycharm来 ...
- TCP/IP地址格式转换API
1.htonl ()和ntohl( ) ntohl( )-----网络顺序转换成主机顺序(长整型) u_long PASCAL FAR ntohl (u_long netlong); htonl ( ...
- ls乱码问题解决
http://note.youdao.com/noteshare?id=c7ff510525b4dadaabb6f6a0a72040cc
- 让块元素在同一行显示的方法: float 和inline-block
float: 定义:按照一个指定的方向移动,遇到父级的边界或者相邻的浮动元素就会停下来(不完全脱离文档流) 值: left.right.none 特点: 1.浮动的块元素可以在一行显示,宽度是被内容撑 ...