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所需要 ...
随机推荐
- [十四]SpringBoot 之 Spring拦截器(HandlerInterceptor)
过滤器属于Servlet范畴的API,与spring 没什么关系. Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截 ...
- [六]SpringBoot 之 连接数据库(mybatis)
在进行配置之前首先要了解springboot是如何使用纯java代码方式初始化一个bean的 以前的版本是在xml中使用beans标签,在其里面配置bean,那么纯Java代码怎么实现呢? 答案就是使 ...
- xpath定位相邻元素方法
在定位页面元素时,有时候需要根据某个元素特征,去定位其相邻元素/兄弟元素,或者定位其父元素的兄弟元素(或叔伯元素的子元素).这里引入xpath的两个定位方法: preceding-sibling fo ...
- 计算机网络:A、B、C、D和E类IP地址
IP地址分为A,B,C,D,E五类. 网络号:用于识别主机所在的网络:主机号:用于识别该网络中的主机. 其中A类分配给政府机关使用,B类地址给大中型企业使用,C类地址给个人使用.这三种是主要的. IP ...
- [洛谷P4626]一道水题 II
题目大意:求$lcm(1,2,3,\cdots,n)\pmod{100000007}$,$n\leqslant10^8$ 题解:先线性筛出质数,然后求每个质数最多出现的次数,可以用$\log_in$来 ...
- 【BZOJ1493】【NOI2007】项链工厂(线段树)
[BZOJ1493]项链工厂(线段树) 题面 BZOJ 洛谷 Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打 ...
- spring mybatis 多数据源配置
1.创建好数据库的配置文件 mysql.url=jdbc:mysql://***/***?useUnicode=true&characterEncoding=UTF-8 mysql.usern ...
- 堡垒机初识--paramiko模块
一.paramiko模块 Python的paramiko模块基于SSH用于连接远程服务器并执行相关的操作. 1.1 在windows上安装paramiko模块 测试环境: win10 , python ...
- 「Linux」centos7安装使用rar
安装 1 wget https://www.rarlab.com/rar/rarlinux-x64-5.5.0.tar.gz 2 tar -xzvf rarlinux-x64-5.5.0.tar.gz ...
- conda 虚拟环境
一.jupyter notbook (1)需要安装: conda install ipykernel (2)首先激活对应的conda环境 source activate 环境名称 (3)将环境写入no ...