POJ1275 Cashier Employment 二分、差分约束
题意太长
为了叙述方便,将题意中的$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 二分、差分约束的更多相关文章
- hdu 1529 Cashier Employment(差分约束)
Cashier Employment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- POJ 1275 Cashier Employment(差分约束)
http://poj.org/problem?id=1275 题意 : 一家24小时营业的超市,要雇出纳员,需要求出超市每天不同时段需要的出纳员数,午夜只需一小批,下午需要多些,希望雇最少的人,给出每 ...
- POJ1275 Cashier Employment 【二分 + 差分约束】
题目链接 POJ1275 题解 显然可以差分约束 我们记\(W[i]\)为\(i\)时刻可以开始工作的人数 令\(s[i]\)为前\(i\)个时刻开始工作的人数的前缀和 每个时刻的要求\(r[i]\) ...
- 【POJ 1275】 Cashier Employment(差分约束系统的建立和求解)
[POJ 1275] Cashier Employment(差分约束系统的建立和求解) Cashier Employment Time Limit: 1000MS Memory Limit: 10 ...
- 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)
layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...
- POJ1275 Cashier Employment[差分约束系统 || 单纯形法]
Cashier Employment Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7997 Accepted: 305 ...
- poj1275收银员——差分约束
题目:http://poj.org/problem?id=1275 做的第一道差分约束题... 首先,根据题意得出一些不等关系(f为前缀和雇佣人数): 0 <= f[i] - f[i-1] &l ...
- POJ1275 Cashier Employment(差分约束)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9078 Accepted: 3515 Description A sup ...
- UVA - 11478 Halum 二分+差分约束
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 题意: 给定一个有向图,每一条边都有一个权值,每次你可以 ...
随机推荐
- python之锁, 队列
进程的其他方法 进程id,进程名字,查看进程是否活着is_alive() terminate()发送结束进程的信号 import time import os from multiprocessin ...
- 遇到了ImportError: libmysqlclient_r.so.16: cannot open shared object file: No such file or directory
解决方法如下: 1. 通过命令查找libmysqlclient_r.so.16 在什么地方,一般是在/usr/lib64/mysql/下面 2. 做一个链接到/usr/lib64 下: ln -s / ...
- List基础操作
/** * List基础操作 * Created by zhen on 2018/11/14. */ object ListDemo { def main(args: Array[String]) { ...
- Scala多重继承及AOP
package traitandclass /** * Created by zhen on 2018/8/23. */ class Human { println("Human" ...
- [20171205]uniq命令的输入输出.txt
[20171205]uniq命令的输入输出.txt --//前几天遇到XXD与通配符问题,链接http://blog.itpub.net/267265/viewspace-2147702/--//今天 ...
- SQLServer限制IP,限制用户,限制SSMS登录
SQL Server不像Mysql那样原生支持限制IP登录. 但可以使用Login触发器来实现. 以下为使用Login触发器实现限制用户u_user_r在指定IP192.168.1.205使用SSMS ...
- 将mssql数据库高版本迁移到低版本
将mssql数据库高版本迁移到低版本 在低版本目标数据库中创建目标空数据库[TargetDb] ,注意新建数据库即可,不要创建任何表 在低版本数据库中,选中[服务器对象=>链接服务器] 右键[新 ...
- knockoutjs关于ko.bindingHandlers的updata订阅
ko.bindingHandlers是先执行init进行初始化数据的绑定(如果需要执行updata进行数据更新可以不用初始化); init: function(element, valueAccess ...
- Emmet快速编写代码
Emmet快速编写代码 ★div → <div></div>, span → <span></span> ★CSS选择器 给标签指定id选择器 di ...
- 17秋 软件工程 团队第五次作业 Alpha Scrum6
17秋 软件工程 团队第五次作业 Alpha Scrum6 今日完成的任务 世强:APP内通知消息发送; 港晨:APP前端登陆界面编写: 树民:Web后端数据库访问模块代码实现: 伟航:Web后端Re ...