差分约束系统——POJ1275
之前做过差分,但是没做过差分约束系统。
正好在学军机房听课讲到这道题,就顺带学了一下。
其实...就是列不等式组然后建图
作为蒟蒻,当然是不会加二分优化的啦...但是poj上还是94ms跑过了qwq
(其实是懒qwq)
解题分析放代码里了。
/*
算法:差分约束系统+二分
思路:设读入的人中,从i时刻开始的人数为num[i],雇佣的人数为x[i]。
i时刻需要的人为r[i]
据此,可以列出两个不等式:
1. 0<=x[i]<=num[i]
2.sum( x[j] )>=r[i] (j=i-7~i)
很容易想到用前缀和。
s[i]=sum( x[j] ),j=1~i
1. s[i]-s[i-1]<=num[i]
2. s[i]-s[i-8]>=r[i] 8<=i<=24
s[i]-s[i+16]+s[24]>=r[i] 1<=i<8
(s[i]-s[i+16]>=r[i]-s[24])
二分s[24],然后建图,根据差分约束系统.
ps:差分约束系统中如果是>=,要么跑最长路,要么不等式两边同时*(-1)
*/
#include <iostream>
#include <queue>
using namespace std;
#define MAXN 25
#define inf 1<<20
struct node
{
int to,weight,next;
}a[MAXN*30];
int head[MAXN],dis[MAXN],cnt[MAXN];
int tot,n,r[MAXN],t[MAXN];
bool vis[MAXN];
void add( int u,int v,int w ) //邻接表
{
a[tot].to=v; a[tot].weight=w; a[tot].next=head[u]; head[u]=tot++;
}
void mem() //初始化
{
tot=0;
for ( int i=0; i<MAXN; i++ )
{
head[i]=-1; dis[i]=inf; vis[i]=0; cnt[i]=0;
}
dis[0]=0;
}
void build( int ans ) //根据差分关系建图
{
mem();
add( 0,24,-ans );
for ( int i=1; i<MAXN; i++ )
{
add( i-1,i,0 ); add( i,i-1,t[i] );
}
for ( int j=1; j<MAXN; j++ )
{
int i=(j+8)%24;
if ( i>j ) add( j,i,-r[i] );
else add( j,i,-r[i]+ans );
}
}
/*
SPFA判断是否有解
因为这个解只有两种情况,无解和有解,而只要不是无解,
第一个找到的有解即为最优解,所以只要没有负环就可以return 1
其实这里可以加二分优化(单调性,人总是越多越好),但是程序中采用了直接枚举,
复杂度也是可以接受的。
*/
bool check( int ans )
{
queue<int> q;
q.push( 0 ); vis[0]=1; cnt[0]=1;
while ( !q.empty() )
{
int p,t=q.front();
q.pop(); p=head[t]; vis[t]=0;
while ( p!=-1 )
{
if ( dis[a[p].to] > dis[t]+a[p].weight )
{
dis[a[p].to]=dis[t]+a[p].weight;
if ( !vis[a[p].to] )
{
vis[a[p].to]=1;
q.push( a[p].to );
cnt[a[p].to]++;
if ( cnt[a[p].to]>24 ) return 0;
}
}
p=a[p].next;
}
}
return 1;
}
int main()
{
int T;
scanf( "%d",&T );
while ( T-- )
{
for ( int i=1; i<=24; i++ )
{
scanf( "%d",&r[i] ); t[i]=0;
}
scanf( "%d",&n );
for ( int i=0; i<n; i++ )
{
int tmp;
scanf( "%d",&tmp ); t[tmp+1]++;
}
bool flag=1;
for ( int i=0; i<=n; i++ )
{
build( i );
if ( check(i) )
{
printf( "%d\n",i );
flag=0; break;
}
}
if ( flag ) printf( "No Solution\n" );
}
}
update 2020.3.26
发现这道题lyd书里也有…… 393.雇佣收银员
差分约束系统——POJ1275的更多相关文章
- UVA11478 Halum [差分约束系统]
https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的 ...
- BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5395 Solved: 1750[Submit][Status ...
- ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)
当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题 ZOJ2770-Burn the Linked Camp //差分约束方 ...
- POJ1201 Intervals(差分约束系统)
与ZOJ2770一个建模方式,前缀和当作点. 对于每个区间[a,b]有这么个条件,Sa-Sb-1>=c,然后我就那样连边WA了好几次. 后来偷看数据才想到这题还有两个隐藏的约束条件. 这题前缀和 ...
- UVA 11374 Halum (差分约束系统,最短路)
题意:给定一个带权有向图,每次你可以选择一个结点v 和整数d ,把所有以v为终点的边权值减少d,把所有以v为起点的边权值增加d,最后要让所有的边权值为正,且尽量大.若无解,输出结果.若可无限大,输出结 ...
- Burn the Linked Camp(bellman 差分约束系统)
Burn the Linked Camp Time Limit: 2 Seconds Memory Limit: 65536 KB It is well known that, in the ...
- zoj 2770 Burn the Linked Camp (差分约束系统)
// 差分约束系统// 火烧连营 // n个点 m条边 每天边约束i到j这些军营的人数 n个兵营都有容量// Si表示前i个军营的总数 那么 1.Si-S(i-1)<=C[i] 这里 建边(i- ...
- POJ 3169 Layout (差分约束系统)
Layout 题目链接: Rhttp://acm.hust.edu.cn/vjudge/contest/122685#problem/S Description Like everyone else, ...
- POJ 3169 Layout 差分约束系统
介绍下差分约束系统:就是多个2未知数不等式形如(a-b<=k)的形式 问你有没有解,或者求两个未知数的最大差或者最小差 转化为最短路(或最长路) 1:求最小差的时候,不等式转化为b-a>= ...
随机推荐
- Loadrunner学习(一)
一个优秀的软件系统不单单具有良好的功能,还需要有过硬的性能,一个只通过功能测试的系统,只能称之为"可用",而不能算是"好用".当然,性能测试需要基于功能测试,只 ...
- 02 Filter过滤器
Filter 一.Filter过滤器 Filter过滤器它是JavaWeb的三大组件之一.三大组件分别是:Servlet程序.Listener监听器.Filter过滤器 Filter过滤器是JavaE ...
- 基于Docker UI 配置ceph集群
前言 前一篇介绍了docker在命令行下面进行的ceph部署,本篇用docker的UI进行ceph的部署,目前来说市面上还没有一款能够比较简单就能直接在OS上面去部署Ceph的管理平台,这是因为OS的 ...
- linux利用screen进行shell下的屏幕协作
我们都知道linux是支持多终端并行处理的 但是某些时候我们可能有比较特殊的需求需要两个人同时处理一个终端,screen 正好能满足这个要求 首先需要安装screen软件: debian和ubuntu ...
- Java-Annotation的一种用法(消除代码中冗余的if/else或switch语句)
Java-Annotation的一种用法(消除代码中冗余的if/else或switch语句) 1.冗余的if/else或switch 有没有朋友写过以下的代码结构,大量的if/esle判断,来选择 ...
- redis源码学习之slowlog
目录 背景 环境说明 redis执行命令流程 记录slowlog源码分析 制造一条slowlog slowlog分析 1.slowlog如何开启 2.slowlog数量限制 3.slowlog中的耗时 ...
- Math.floor(Math.random() * array.length),splice
1.Math.floor(Math.random() * array.length) 返回长度内的索引 eg: changeLimit () { function getArrayItems(arr, ...
- Java8用了这么久了,Stream 流用法及语法你都知道吗?
1.简介 Stream流 最全的用法Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,Stream API 提供了一 ...
- 解决Maven项目中pom.xml文件报错(Failure to transfer....)的问题
打开pom.xml文件,查看错误,如果错误类型为:Failure to transfer.........之类的,则表明你的pom中依赖的jar包没有完全下载. 解决方法:找到你本地的maven仓库, ...
- Java基础教程——正则表达式
正则表达式·Regular Expression 正则表达式就是一个用于匹配字符串的模板,正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. 主要用到的对象: java.util.rege ...