hdu1529 差分约束(好题)
题意:
超市在每个时间都有需要的人数(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 差分约束(好题)的更多相关文章
- POJ 1364 King --差分约束第一题
题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析 ...
- poj 3159(差分约束经典题)
题目链接:http://poj.org/problem?id=3159思路:题目意思很简单,都与给定的条件dist[b]-dist[a]<=c,求dist[n]-dist[1]的最大值,显然这是 ...
- poj 1201 Intervals——差分约束裸题
题目:http://poj.org/problem?id=1201 差分约束裸套路:前缀和 本题可以不把源点向每个点连一条0的边,可以直接把0点作为源点.这样会快许多! 可能是因为 i-1 向 i 都 ...
- 【NOIP模拟赛】收银员(一道差分约束好题)
/* s[]表示最优方案的序列中的前缀和,那么s[23]就是最优方案 由题意我们可以列出这样一些式子: s[i]+s[23]-s[16+i]>=a[i] (i-8<0) s[i]-s[i- ...
- hdu 3440(差分约束好题)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- poj 3169 Layout 差分约束模板题
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6415 Accepted: 3098 Descriptio ...
- BZOJ3436: 小K的农场(差分约束裸题&DFS优化判环)
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2111 Solved: 986[Submit][Status][Discus ...
- hdu 1531(差分约束)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1531 差分约束的题之前也碰到过,刚好最近正在进行图论专题的训练,就拿来做一做. ①:对于差分不等式,a ...
- 【BZOJ3436】小K的农场(差分约束)
[BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...
随机推荐
- 微信小程序onReachBottom第二次失效
当整个页面就是一个view包着一个轮播.一个横向scroll-view和一个纵向scroll-view onReachBottom方法只执行一次 解决方法:
- Java开发工程师最新面试题库系列——Mybatis框架部分(附答案)
Mybatis Mybatis是什么框架? 答:持久层框架 Mybatis和ORM有什么区别? 答:ORM是对象关系映射的一种设计理念,也就是对象属性对应数据库字段,让开发人员以操作对象的方式操作数据 ...
- python带颜色打印字符串
python带颜色打印字符串 之前调试pwn题的时候,有时候需要将某些特别的,重要的信息用不一样的颜色打印出来.查阅一些资料,了解了print函数的特性后,自己写了一个脚本,可以用来获取带颜色信息的字 ...
- (十三)数据库查询处理之QueryExecution(2)
(十三)数据库查询处理之QueryExecution(2) 实验室这一周真的忙爆(虽然都是各种打杂的活)所以拖了很久终于在周末(摸鱼)把实验3做完了.同时准备把和查询这一块有关的博客补一下.然后就进入 ...
- IDEA的下载、安装与破解
IDEA的下载.安装与破解 下载地址:https://www.jetbrains.com/idea/download/#section=windows 建议下载2018.2版本,方便破解 安装 一直下 ...
- FreeBSD 宣布 2020 年第 4 季度状态报告
FreeBSD 宣布 2020 年第 4 季度状态报告● 继续努力从 FreeBSD 基本系统中移除 GPL 协议的软件,以实现 FreeBSD 项目基本目标.● Linux 二进制兼容层的 Linu ...
- nginx安装&负载均衡配置&nginx反爬虫&nginx命令
Nginx安装 wget https://nginx.org/download/nginx-1.14.0.tar.gz tar -zxvf nginx-1.14.0.tar.gz cd nginx-1 ...
- 订单退款&重复支付需求疑问点归纳整理
更新历史记录: 更新内容 更新人 更新时间 新建 Young 2020.12.10 16:45 更新产品疑问解答 Young 2020.12.11 10:14 更新退款权益终止时间 Young 2 ...
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- 后台开发-核心技术与应用实践--TCP协议
网络模型 为使不同计算机厂家的计算机能够互相通信,国际标准化组织 ISO 1981 年正式推荐了一个网络系统结构一一七层参考模型,也叫作开放系统互连模型. ISO 七层网络模型及其功能展示: 这个七层 ...