HDU [1529] || POJ [P1275] Cashier Employment
经典的差分约束+二分答案。
本题的难点在于如何建图。
设x[i] 表示第i个小时可以开始工作的有多少个人。
num[i] 表示第i个小时最少需雇佣多少人。
s[i] 表示1...i小时实际开始工作的有多少人
因为最后要求的是s[24]的最小值,所以我们以s为中心建图。
因为我们求得是最小值,所以都转化成>=号的形式
我们逐步分析题目的已知条件:
- 第i小时实际开始工作的人数应小于等于可以开始的人数,即 $ s[i]-s[i-1]<=x[i] $ 变成 $ s[i-1]-s[i] >=-x[i] $
- 第i小时实际开始工作的人数应大于等于0,即$ s[i]-s[i-1]>=0 $ .
- 第i小时实际工作的人数应大于等于最少需雇佣的人数,即 $ s[i]-s[i-8]>=x[i] $ .
当i>=8 时,$ s[i]-[i-8]>=x[i] \(
当i<8 时,\) s[24]+s[i]-s[i+16]>=x[i] $
我们发现上式有三个变量,不符合差分约束的基本形式,我们可以二分答案,将上式变为 $ s[i]-s[i+16]>=x[i]-ans $
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <ctime>
#define RST(a) memset((a),0,sizeof((a)))
using namespace std;
const int MAXN=50005;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return fh*rv;
}
struct edge{
int to,nxt,dis;
}e[MAXN];
int T,head[MAXN],num[30],pre[30],x[30],nume,dis[30];
void adde(int from,int to,int dis){
e[++nume].to=to;
e[nume].dis=dis;
e[nume].nxt=head[from];
head[from]=nume;
}
bool SPFA(){
for(int i=0;i<=29;i++) dis[i]=-0x3f3f3f3f;
bool f[30];
int cnt[30];
RST(f);RST(cnt);
queue <int> q;
q.push(24);
dis[24]=0;
f[24]=1;
while(!q.empty()){
int u=q.front();q.pop();
f[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(dis[v]<dis[u]+e[i].dis){
dis[v]=dis[u]+e[i].dis;
if(!f[v]){
q.push(v);
f[v]=1;
cnt[v]++;
if(cnt[v]>=23) return 0;
}
}
}
}
if(dis[0]==-0x3f3f3f3f) return 0;
else return 1;
}
bool check(int mid){
RST(e);RST(head);nume=0;RST(dis);
for(int i=1;i<=24;i++){
adde(i-1,i,0);
adde(i,i-1,-x[i]);
if(i>=8){
adde(i-8,i,num[i]);
}
}
for(int i=0;i<8;i++){
adde(i+16,i,num[i]-mid);
}
if(SPFA()) return 1;
else return 0;
}
int main(){
//freopen("in.txt","r",stdin);
srand(time(NULL));
T=init();
while(T--){
RST(num);RST(x);RST(dis);RST(head);RST(e);
nume=0;RST(pre);
for(int i=0;i<=23;i++) num[i]=init();
int n=init();
for(int i=1;i<=n;i++){
int t=init();
x[t]++;
}
pre[0]=x[0];
for(int i=1;i<=23;i++){
pre[i]=pre[i-1]+x[i];
}
int l=0,r=n,mid=0;
while(l<=r){
mid=(l+r)/2;
if(check(mid)){
r=mid-1;
}else l=mid+1;
}
if(l>=n) printf("No Solution\n");
else printf("%d\n",l);
}
//fclose(stdin);
return 0;
}
HDU [1529] || POJ [P1275] Cashier Employment的更多相关文章
- 图论(差分约束系统):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 - 差分约束 - 二分答案
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 挺难的差分约束题
http://poj.org/problem?id=1275 题目大意: 一商店二十四小时营业,但每个时间段需求的雇员数不同(已知,设为R[i]),现有n个人申请这份工作,其可以从固定时间t连续工作八 ...
- [HDU 1529]Cashier Employment(差分约束系统)
[HDU 1529]Cashier Employment(差分约束系统) 题面 有一个超市,在24小时对员工都有一定需求量,表示为\(r_i\),意思为在i这个时间至少要有i个员工,现在有n个员工来应 ...
- hdu 1529 Cashier Employment(差分约束)
Cashier Employment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 【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 ...
随机推荐
- 免费V P N获取方式。
给需要加速器链接国外网站的朋友, 打开网址:http://miaoaff.com/reg.php?id=204250: 用一个邮箱注册,就会得到一个免费的vpn软件账号(包含300M流量时间永久): ...
- javascript数据类型及转换
此篇数据类型和转换只限于ECMA规范,规范用了比较大的篇幅讲数据类型和类型转换,理解了这个最基本的概念对表达式.语句.执行环境.对象及继承都有非常大的帮助,遂整理如下: 数据类型和值 类型转换 表达式 ...
- k8s 创建资源的两种方式 - 每天5分钟玩转 Docker 容器技术(124)
命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...
- window.top.location.href 和 window.location.href 的区别
window.location.href 是本页面跳转 window.top.location.href是最外层的页面跳转
- VUE之ECMAScript6(es6)
es6:es:EMCAScript 6 (es2015)Emca:国际标准组织 1.常量和变量 const a = "hello" let:定义一个块级作用域的变量 需要先定义再使 ...
- Html5+js测试题(开发版)
------------------------------------------------ 1. 谈谈你对js闭包的理解: 使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的 ...
- Java 对二值化图片识别连通域
用Java 对 已经 二值化了的图片 标记连通域 每块的连通域都标记不一样的数字 public static void main(String [] args) throws IOException ...
- MyEclipse或Eclipse导出JavaDoc中文乱码问题解决
- 2017-06-24(chgrp umask alias unalias)
chgrp chgrp 组名 文件名 chgrp root newfile 将newfile的所属组修改为root umask umask 查看默认权限 0 022 文件的特殊权限 文件的默认 ...
- Oracle Sqlload 导入数据
sqlload导入数据具有快,简单,无需校验等方便,多说无益 1 首先,oracle数据库要有这么个表,用来接收数据.我这里这个uuid是序列生成的,当然也可以sqlload导入时候分配uuid -- ...