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所需要 ...
随机推荐
- hdfs源码分析第二弹
以写文件为例,串联整个流程的源码: FSDataOutputStream out = fs.create(outFile); 1. DistributedFileSystem 继承并实现了FileSy ...
- 部分NodeJs
一.cnmp的操作: 1.cnmp info jquery查询jquery的版本: 2.cnmp install jquery@1.11.1:安装: 3.cnmp list查询所有下载的内容: 4.c ...
- Infinity NaN undefined和null
Infinity属性用于存放表示正无穷大的数值. 负无穷大是表示负无穷大一个数字值. 该属性为Global对象的一个只读属性, 所有主流浏览器均支持该属性. Infinity属性的值为Number类型 ...
- vue项目 axios封装第二弹
import axios from "axios"; import qs from "qs"; import { Message, MessageBox } f ...
- 深入理解JVM一垃圾回收器
上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中,用户可以根据自身的需求,使用不同的垃 ...
- BZOJ1176:[Balkan2007]Mokia——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1176 Description(题面本人自行修改了一下) 维护一个W*W的矩阵,初始值均为0.每次操作 ...
- Codeforces 582C. Superior Periodic Subarrays(数学+计数)
首先可以把 i mod n=j mod n的看成是同一类,i mod s=j mod s的也看成是同一类,也就是i mod gcd(s,n)的是同一类,很好理解,但是不会数学证明...大概可以想成数轴 ...
- Hexo之我的桌角女友的食用方式
秀秀 通过使用一个名为 hexo-helper-live2d 的开源库,可以轻松的在自己的Hexo网站下贴上一只生猛可爱的萌妹子或主子: 什么是live2d Live2d是11区宅男们开发出的虚拟女友 ...
- Java之面向对象编程20170619
/*************************************************************************************************** ...
- web项目引用tomcat中的jar
web项目引用tomcat中的jar https://blog.csdn.net/zjsdrs/article/details/77868827 如下图所示