传送门

题意太长


为了叙述方便,将题意中的$0$点看作$1$点,$23$点看做$24$点

考虑二分答案(其实从小到大枚举也是可以的)

设$x_i$是我们选的雇员第$i$小时开始工作的人数,$s_i$是$x_i$的前缀和,又设$p_i$为可以在第$i$小时开始工作的人数,$q_i$表示第$i$小时需要的人数,$mid$为我们二分的答案

那么我们有

$$s_i-s_{i-8} \geq q_i , 8 \leq i \leq 24$$

$$s_i - s_{i+16} \geq q_i - mid , 1 \leq i \leq 7$$

$$s_{i - 1} - s_i \geq -p_i$$

$$s_i - s_{i-1} \geq 0$$(很容易漏掉)

$$s_{24}-s_{0} \geq mid$$

最后一条边的原因是:注意到第二种边中我们强制了$s_{24} = mid$,但是实际跑出来的解有可能$s_{24} \neq mid$,那么第二个式子就很有可能不成立。但是当$mid < s_{24}$时令$mid = s_{24}$时条件显然仍然成立,所以我们只需要让$s_{24} < mid$的时候强制让$s_{24} \geq mid$才行。

直接差分约束求最长路就完了

差分约束有很多细节需要注意,掉了很多次坑qwq(比如每一次的queue都要清空)

 #include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std; inline int read(){
int a = ;
bool f = ;
char c = getchar();
while(c != EOF && !isdigit(c)){
if(c == '-')
f = ;
c = getchar();
}
while(c != EOF && isdigit(c)){
a = (a << ) + (a << ) + (c ^ '');
c = getchar();
}
return f ? -a : a;
} struct Edge{
int end , upEd , w;
}Ed[*];
int num[] , x[] , maxDis[] , flo[] , head[] , cntEd , preHead[] , preCnt;
queue < int > q;
bool inq[]; inline void addEd(int a , int b , int c){
Ed[++cntEd].end = b;
Ed[cntEd].upEd = head[a];
Ed[cntEd].w = c;
head[a] = cntEd;
} inline bool check(int mid){
while(!q.empty())q.pop();
memcpy(head , preHead , sizeof(preHead));
cntEd = preCnt;
for(int i = ; i <= ; i++)
addEd(i + , i , num[i] - mid);
addEd( , , mid);
memset(maxDis , -0x3f , sizeof(maxDis));
memset(inq , , sizeof(inq));
memset(flo , , sizeof(flo));
maxDis[] = ;
q.push();
while(!q.empty()){
int t = q.front();
q.pop();
inq[t] = ;
for(int i = head[t] ; i ; i = Ed[i].upEd)
if(maxDis[Ed[i].end] < maxDis[t] + Ed[i].w){
maxDis[Ed[i].end] = maxDis[t] + Ed[i].w;
if((flo[Ed[i].end] = flo[t] + ) >= )
return false;
if(!inq[Ed[i].end]){
inq[Ed[i].end] = ;
q.push(Ed[i].end);
}
}
}
return true;
} int main(){
#ifdef LG
freopen("1275.in" , "r" , stdin);
#endif
for(int T = read() ; T ; T--){
for(int i = ; i <= ; i++)
num[i] = read();
cntEd = ;
memset(head , , sizeof(head));
memset(x , , sizeof(x));
int P = read() , L = , R = P + ;
for(int i = P ; i ; i--)
x[read() + ]++;
for(int i = ; i < ; i++)
addEd(i , i + , );
for(int i = ; i <= ; i++)
addEd(i - , i , num[i]);
for(int i = ; i <= ; i++)
addEd(i , i - , -x[i]);
memcpy(preHead , head , sizeof(head));
preCnt = cntEd;
while(L < R){
int mid = L + R >> ;
check(mid) ? R = mid : L = mid + ;
}
if(L > P)
puts("No Solution");
else
cout << L << endl;
}
return ;
}

POJ1275 Cashier Employment 二分、差分约束的更多相关文章

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

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

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

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

  3. POJ1275 Cashier Employment 【二分 + 差分约束】

    题目链接 POJ1275 题解 显然可以差分约束 我们记\(W[i]\)为\(i\)时刻可以开始工作的人数 令\(s[i]\)为前\(i\)个时刻开始工作的人数的前缀和 每个时刻的要求\(r[i]\) ...

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

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

  5. 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)

    layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...

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

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

  7. poj1275收银员——差分约束

    题目:http://poj.org/problem?id=1275 做的第一道差分约束题... 首先,根据题意得出一些不等关系(f为前缀和雇佣人数): 0 <= f[i] - f[i-1] &l ...

  8. POJ1275 Cashier Employment(差分约束)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9078   Accepted: 3515 Description A sup ...

  9. UVA - 11478 Halum 二分+差分约束

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 题意: 给定一个有向图,每一条边都有一个权值,每次你可以 ...

随机推荐

  1. Python之历史

    一.python简单介绍 python的创始人:吉多·范罗苏姆(Guido van Rossum),于1989年开始编写,到1991年完成了第一个python编译器.它是用C语言实现的,并能够调用C语 ...

  2. Ado.net 访问Oracle乱码问题

    之前安装Oracle - OraClient10g_home1客户端,用Ado.net访问没有问题,后来安装ODP之后,自动的又安装了Oracle - OraClient12Home1,之后就出现乱码 ...

  3. python自动化开发-9 进程 线程

    进程与线程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一 ...

  4. Clumsy 利用无线网卡结合Clumsy软件模拟弱网络测试

    利用无线网卡结合Clumsy软件模拟弱网络测试 by:授客 QQ:1033553122 实践环境 Clumsy 0.2 下载地址:http://jagt.github.io/clumsy/downlo ...

  5. 微信小程序-06-详解介绍.js 逻辑层文件-注册页面

    上一篇介绍的是 app.js 逻辑层文件中注册程序,对应的每个分页面都会有的 js 文件中 page() 函数注册页面 微信小程序-06-详解介绍.js 逻辑层文件-注册页面 宝典官方文档: http ...

  6. Appium学习——Appium工作原理

    appium的工具原理 Appium-client>>>>Appium-server>>>>移动设备 ========================= ...

  7. 洗礼灵魂,修炼python(46)--巩固篇—如虎添翼的property

    @property 在前面装饰器一章中,提过一句话,装饰器也可以用于类中,确实可以的,并且python的类也内置了一部分装饰器.并且在前两章的hasattr等四个内置方法中,也说过其用法很类似装饰器, ...

  8. entity framework异常 The specified cast from a materialized 'System.Int32' type to the 'System.String' type is not valid

    ROW_NUMBER() OVER (ORDER BY (select Null)) AS Id entity framework 查询中有这句会有异常

  9. 常用Linux 服务器命令--各种性能指标命令

    如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个专业的 Linux 系统管理员. 监控命令## iostat### iostat命令用来显示存储系统的 ...

  10. CentOS7:搭建配置SVN服务器

    1. 安装 CentOS通过yum安装subversion. $ sudo yum install subversion subversion安装在/bin目录: $ which svnserve / ...