经典的差分约束+二分答案。

本题的难点在于如何建图。

设x[i] 表示第i个小时可以开始工作的有多少个人。

num[i] 表示第i个小时最少需雇佣多少人。

s[i] 表示1...i小时实际开始工作的有多少人

因为最后要求的是s[24]的最小值,所以我们以s为中心建图。

因为我们求得是最小值,所以都转化成>=号的形式

我们逐步分析题目的已知条件:

  1. 第i小时实际开始工作的人数应小于等于可以开始的人数,即 $ s[i]-s[i-1]<=x[i] $ 变成 $ s[i-1]-s[i] >=-x[i] $
  2. 第i小时实际开始工作的人数应大于等于0,即$ s[i]-s[i-1]>=0 $ .
  3. 第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的更多相关文章

  1. 图论(差分约束系统):POJ 1275 Cashier Employment

    Cashier Employment Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7651   Accepted: 288 ...

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

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

  3. poj 1275 Cashier Employment

    http://poj.org/problem?id=1275 #include <cstdio> #include <cstring> #include <algorit ...

  4. 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 ...

  5. POJ 1275 Cashier Employment 挺难的差分约束题

    http://poj.org/problem?id=1275 题目大意: 一商店二十四小时营业,但每个时间段需求的雇员数不同(已知,设为R[i]),现有n个人申请这份工作,其可以从固定时间t连续工作八 ...

  6. [HDU 1529]Cashier Employment(差分约束系统)

    [HDU 1529]Cashier Employment(差分约束系统) 题面 有一个超市,在24小时对员工都有一定需求量,表示为\(r_i\),意思为在i这个时间至少要有i个员工,现在有n个员工来应 ...

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

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

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

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

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

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

随机推荐

  1. http://acm.hdu.edu.cn/showproblem.php?pid=1039(水~)

    判读条件 1:有元音字母 2:不能三个连续元音或辅音 3.不能连续两个相同的字母,除非ee或oo #include<cstdio> #include<cstring> #inc ...

  2. BZOJ2425: [HAOI2010]计数

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2425 其实能够构成的数就是原数的排列(算前导0),然后组合计数一下就可以了. #include ...

  3. oracle ebs form开发总结

    item的布局千万不要去乱动,只要调好长宽和y轴的坐标就好了.form内部集成了很多代码对布局进行动态的调整,而且有一些代码的长宽什么的还是写死了的,我们一动,form可能就识别不了了,然后就显示出来 ...

  4. c语言基础学习09_关于复合类型的复习

    =============================================================================struct A{ char array[10 ...

  5. Vue2反向代理

      前一段时间写了一个vue2的小项目,用的是vue-cli脚手架搭建的项目,项目里需要跨域,但又不能使用jsonp,上网查了一下,发现有一个之前没接触过的词语--反向代理. 什么是"反向代 ...

  6. Hibernate查询对象的方法浅析

    Hibernate 查询对象是根据对象的id查询的,只要你有id (id唯一),则无论你是否其他字段与传过来的对象一致,都会查到该id在数据库对应的对象.若是在关联查询中,所关联表的id为空,即所查表 ...

  7. WPF 文本滚动效果 渐变效果

    <DockPanel> <StackPanel DockPanel.Dock="Bottom" VerticalAlignment="Bottom&qu ...

  8. vue学习笔记(二)——简单的介绍以及安装

    学习编程需要的是 API+不断地练习^_^ Vue官网:https://cn.vuejs.org/ 菜鸟教程:http://www.runoob.com/vue2/vue-tutorial.html ...

  9. Jade报错:Invalid indentation,you can use tabs or spaces but not both问题

    现象:通过html生成jade文件之后,更改jade文件时,语句没什么问题的情况下,jade文件编译不通过,报错:Invalid indentation,you can use tabs or spa ...

  10. CCF系列之最优灌溉(201412-4)

    试题编号:201412-4试题名称:最优灌溉时间限制: 1.0s内存限制: 256.0MB 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来 ...