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 题意: 给定一个有向图,每一条边都有一个权值,每次你可以 ...
随机推荐
- css iphonex适配
/* iphonex适配 */ @media only screen and (device-width:375px) and (-webkit-device-pixel-ratio: 3) { . ...
- ssms2014和ssms2016版本错误定位的区别
偶尔对比起2016以下的版本(比如ssms2014),ssms2016有一个小地方有区别.就是报错的行号有区别 举个例子,下面同样的语句在ssms2014和ssms2016里面运行.就是如下的效果 C ...
- Kotlin入门(11)江湖绝技之特殊函数
上一篇文章介绍了Kotlin对函数的输入参数所做的增强之处,其实函数这块Kotlin还有好些重大改进,集中体现在几类特殊函数,比如泛型函数.内联函数.扩展函数.尾递归函数.高阶函数等等,因此本篇文章就 ...
- linux下zip文件解压乱码的问题
因为编码问题,zip文件中的中文文件在linux下解压会出现乱码 如果你使用archlinux那么使用AUR安装unzip-natspec就可以解决这个问题 https://aur.archlinux ...
- Derek解读Bytom源码-持久化存储LevelDB
作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...
- MVC| 路由测试代码
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System.Web; using ...
- 转,ffmpeg参数中文详细解释
a) 通用选项 -L license-h 帮助-fromats 显示可用的格式,编解码的,协议的...-f fmt 强迫采用格式fmt-I filename 输入文件-y 覆盖输出文件-t durat ...
- 用Python实现数据结构之栈
栈 栈是最简单的数据结构,也是最重要的数据结构.它的原则就是后进先出(LIFO),栈被使用于非常多的地方,例如浏览器中的后退按钮,文本编辑器中的撤销机制,接下来我们用Python来具体实现这个数据结构 ...
- Python+Pandas 读取Oracle数据库
Python+Pandas 读取Oracle数据库 import pandas as pd from sqlalchemy import create_engine import cx_Oracle ...
- UITableView详解
一.建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(, , , )]; [DataTable setD ...