题意:

      超市在每个时间都有需要的人数(24小时)比如 1 0 0 0 0 。。。。也就是说在第0个小时的时候要用一个人,其他的时间都不用人,在给你一些人工作的起始时间,如果雇佣了这个人,那么这个人就会从自己的其实时间工作8个小时后离开,给你需求和可雇佣的员工,问你满足需求超时最少雇佣多少人。

思路:

      经典的差分约束,之前尝试过很多次都没AC,今天终于AC了,现在我们就来找各种隐含条件。

设:

num[i] 表示第i个小时开始的有多少个人。

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

s[i] 表示1。。。i小时开始工作的有多少人。 (我们以S为核心建图)

限制条件:

第i个小时雇佣并开始工作的人数 >= 0 

则 s[i] - s[i-1] >= 0

第i个小时雇佣并开始工作的人数 <= num[i] 

则 s[i] - s[i-1] <= num[i] 转化成 s[i-1] - s[i] >= -num[i]

第i个小时雇佣的人数 >= r[i]

则 s[i] - s[i-8] >= r[i]               (i >= 8 && i <= 24)

   s[24] + s[i] - s[i + 16] >= r[i]    (i <= 7)

观察最后一个不等式,出现了三个变量,不符合差分约束形式,所以我们就直接二分枚举

s[24]的值,也就是二分枚举雇佣人数的值,这样就把最后一个转换成

s[i] - s[i + 16] >= r[i] - mid

最后别忘了还有一个限制条件就是s[24] - s[0] = mid,=怎么建边呢?我们可以这样

s[24] - s[0] >= mid并且 s[24] - s[0] <= mid

第二个转换成 s[0] - s[24] >= -mid;

这样就可以二分下去了。。。


#include<stdio.h>
#include<string.h>
#include<queue> #define N_node 30
#define N_edge 10000
#define INF 1000000000

using namespace
std; typedef struct
{
int
to ,cost ,next;
}
STAR; STAR E[N_edge];
int
list[N_node] ,tot;
int
s_x[N_node];
int
r[30] ,num[1100]; void add(int a ,int b ,int c)
{

E[++tot].to = b;
E[tot].cost = c;
E[tot].next = list[a];
list[a] = tot;
} bool
Spfa(int s ,int n)
{
for(int
i = 0 ;i <= n ;i ++)
s_x[i] = -INF;
int
mark[N_node] = {0};
int
in[N_node] = {0};
s_x[s] = 0;
mark[s] = in[s] = 1;
queue<int>q;
q.push(s);
while(!
q.empty())
{
int
xin ,tou;
tou = q.front();
q.pop();
mark[tou] = 0;
for(int
k = list[tou] ;k ;k = E[k].next)
{

xin = E[k].to;
if(
s_x[xin] < s_x[tou] + E[k].cost)
{

s_x[xin] = s_x[tou] + E[k].cost;
if(!
mark[xin])
{

mark[xin] = 1;
if(++
in[xin] > n) return 0;
q.push(xin);
}
}
}
}
return
1;
} bool
ok(int mid)
{

memset(list ,0 ,sizeof(list));
tot = 1;
for(int
i = 1 ;i <= 24 ;i ++)
{

add(i - 1 ,i ,0);
add(i ,i - 1 ,-num[i]);
if(
i >= 8) add(i - 8 ,i ,r[i]);
else
add(i + 16 ,i ,r[i] - mid);
}

add(0 ,24 ,mid);
add(24 ,0 ,-mid);
return
Spfa(0 ,24);
} int main ()
{
int
t ,i ,a ,n;
scanf("%d" ,&t);
while(
t--)
{
for(
i = 1 ;i <= 24 ;i ++)
scanf("%d" ,&r[i]);
scanf("%d" ,&n);
memset(num ,0 ,sizeof(num));
for(
i = 1 ;i <= n ;i ++)
{

scanf("%d" ,&a);
num[a+1] ++;
}
int
low ,mid ,up;
low = 0 ,up = n;
int
ans = -1;
while(
low <= up)
{

mid = (low + up) >> 1;
if(
ok(mid))
{

ans = mid;
up = mid - 1;
}
else
low = mid + 1;
}
if(
ans == -1) puts("No Solution");
else
printf("%d\n" ,ans);
}
return
0;
}


hdu1529 差分约束(好题)的更多相关文章

  1. POJ 1364 King --差分约束第一题

    题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析 ...

  2. poj 3159(差分约束经典题)

    题目链接:http://poj.org/problem?id=3159思路:题目意思很简单,都与给定的条件dist[b]-dist[a]<=c,求dist[n]-dist[1]的最大值,显然这是 ...

  3. poj 1201 Intervals——差分约束裸题

    题目:http://poj.org/problem?id=1201 差分约束裸套路:前缀和 本题可以不把源点向每个点连一条0的边,可以直接把0点作为源点.这样会快许多! 可能是因为 i-1 向 i 都 ...

  4. 【NOIP模拟赛】收银员(一道差分约束好题)

    /* s[]表示最优方案的序列中的前缀和,那么s[23]就是最优方案 由题意我们可以列出这样一些式子: s[i]+s[23]-s[16+i]>=a[i] (i-8<0) s[i]-s[i- ...

  5. hdu 3440(差分约束好题)

    House Man Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. poj 3169 Layout 差分约束模板题

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6415   Accepted: 3098 Descriptio ...

  7. BZOJ3436: 小K的农场(差分约束裸题&DFS优化判环)

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2111  Solved: 986[Submit][Status][Discus ...

  8. hdu 1531(差分约束)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1531 差分约束的题之前也碰到过,刚好最近正在进行图论专题的训练,就拿来做一做. ①:对于差分不等式,a ...

  9. 【BZOJ3436】小K的农场(差分约束)

    [BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...

随机推荐

  1. win10使用cmd命令关闭防火墙

    在搜索框内输入cmd,右键选择管理员运行 然后输入: NetSh Advfirewall set allprofiles state off #关闭防火墙 Netsh Advfirewall show ...

  2. CVE-2019-2618 任意文件上传

    漏洞描述:CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口,该接口支持向服务器上传任意文件.攻击者突破了OAM(Oracle Access Ma ...

  3. 基础篇:java.security框架之签名、加密、摘要及证书

    前言 和前端进行数据交互时或者和第三方商家对接时,需要对隐私数据进行加密.单向加密,对称加密,非对称加密,其对应的算法也各式各样.java提供了统一的框架来规范(java.security)安全加密这 ...

  4. HTML标签解读

    因为最近在学习爬虫,那么在爬取网页内容时,就要求我们能够简单的看懂这个网页的基本结构,才能更好的去爬取我们所需要的内容. 这篇随笔也只是简单的说明了一些标签的含义. 标签关系 包含关系 eg:< ...

  5. visualvm工具远程对linux服务器上的JVM虚拟机进行监控与调优

    文/朱季谦 最近在做了一些JVM监控与调优的事情,算是第一次实践,还比较陌生,故而先把这一次经验简单记下笔记,这样,对后面学习调优方面时,不至于又想不起来了.本文档主要总结在window本地环境远程对 ...

  6. 我的开源GIS解决方案之路

    好久没更新了,因为我在--憋--大--招--,对,就是今天这篇. 今天跟大家分享一下我的开源GIS解决方案经历. --额-- 考虑到单聊技术解决方案你可能会很快睡着,所以我今天会把重点放在我封装地图A ...

  7. limanmanExp数据库审计设计思路与重要代码

    目的 在代码审计的时候经常会想看看某个访问会触发哪些数据库操作.目前已知的数据库审计有多家大型厂商的设备,还有seay源码审计系统中的数据库监控1.0 但是.开源的已知的就只有seay源码审计系统中的 ...

  8. IndentationError:unexpected indent”、“IndentationError:unindent does not match any outer indetation level”以及“IndentationError:expected an indented block Python常见错误

    错误的使用缩进量 记住缩进增加只用在以:结束的语句之后,而之后必须恢复到之前的缩进格式. 经典错误,一定要注意缩进,尤其是在非界面化下环境的代码修改

  9. ES9的新特性:正则表达式RegExp

    简介 正则表达式是我们做数据匹配的时候常用的一种工具,虽然正则表达式的语法并不复杂,但是如果多种语法组合起来会给人一种无从下手的感觉. 于是正则表达式成了程序员的噩梦.今天我们来看一下如何在ES9中玩 ...

  10. [树形DP]没有上司的晚会

    没 有 上 司 的 晚 会 没有上司的晚会 没有上司的晚会 题目描述 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职 ...