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 ...
随机推荐
- mysql数据库备份及还原
数据库备份代码: package com.gd.test; import java.io.BufferedReader; import java.io.FileOutputStream; import ...
- h5学习笔记:vuethink 配置
vuethink 是一款基于PHP TP5和Vuejs 结合的后台框架,设计起来是使用较为前沿.在使用的过程,需要对这款开源的后台做一些调整和面对一些细节的坑.前段时间也因为有项目需求,所以下载了玩了 ...
- vue-cli创建的项目中引入第三方库报错 'caller', 'calle', and 'arguments' properties may not be...
http://blog.csdn.net/sophie_u/article/details/76223978 以在vue中引入mui第三方库为例: 虽然针对vue,有单独的vue-mui库可以使用,但 ...
- mac通过自带的ssh连接Linux服务器并上传解压文件
需求: 1:mac连接linux服务器 2:将mac上的文件上传到linux服务器指定位置 3:解压文件 mac上使用命令,推荐使用 iterm2 .当然,也可以使用mac自带的终端工具. 操作过程: ...
- vue-cli的webpack模版项目配置解析
上一篇文章已经分析了build/dev-server.js,里面使用到了其他config文件. 那么我们这篇文章,按着dev-server.js的使用顺序,来分析下其他文件. 首选,调用check-v ...
- openfire服务器+Spark搭建即时聊天系统 & 阿里云的初步探索
晚上出去和洋仔吃了涮肉,喝了点啤酒,不知不觉就聊到了11点,感觉他工作状态还不错,emmm...都要加油吧.虽然没有当时去山西零下二十多度那么夸张,这几天北京的冬夜还是有点小冷的.好了进入正题: 一. ...
- 基于Redis的分布式锁的简单实现
Redis官方给出两种思路 第一种:SET key value [EX seconds] [PX milliseconds] NX 第二种:SETNX+GETSET 首先,分别看一下这几个命令 SET ...
- [SinGuLaRiTy] 复习模板-数学
[SinGuLaRiTy-1047] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 质因数分解 void solve(int n) { == ...
- Angular 4+ Http
HTTP: 使应用能够对远端服务器发起相应的Http调用: 你要知道: HttpModule并不是Angular的核心模块,它是Angualr用来进行Web访问的一种可选方式,并位于一个名叫@angu ...
- Java中的对象Object方法之---wait()和notifiy()
这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread类上的.我们也知道这两个方法是实现 ...