之前做过差分,但是没做过差分约束系统。

正好在学军机房听课讲到这道题,就顺带学了一下。

其实...就是列不等式组然后建图

作为蒟蒻,当然是不会加二分优化的啦...但是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的更多相关文章

  1. UVA11478 Halum [差分约束系统]

    https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的 ...

  2. BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status ...

  3. ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)

    当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题 ZOJ2770-Burn the Linked Camp //差分约束方 ...

  4. POJ1201 Intervals(差分约束系统)

    与ZOJ2770一个建模方式,前缀和当作点. 对于每个区间[a,b]有这么个条件,Sa-Sb-1>=c,然后我就那样连边WA了好几次. 后来偷看数据才想到这题还有两个隐藏的约束条件. 这题前缀和 ...

  5. UVA 11374 Halum (差分约束系统,最短路)

    题意:给定一个带权有向图,每次你可以选择一个结点v 和整数d ,把所有以v为终点的边权值减少d,把所有以v为起点的边权值增加d,最后要让所有的边权值为正,且尽量大.若无解,输出结果.若可无限大,输出结 ...

  6. Burn the Linked Camp(bellman 差分约束系统)

    Burn the Linked Camp Time Limit: 2 Seconds      Memory Limit: 65536 KB It is well known that, in the ...

  7. zoj 2770 Burn the Linked Camp (差分约束系统)

    // 差分约束系统// 火烧连营 // n个点 m条边 每天边约束i到j这些军营的人数 n个兵营都有容量// Si表示前i个军营的总数 那么 1.Si-S(i-1)<=C[i] 这里 建边(i- ...

  8. POJ 3169 Layout (差分约束系统)

    Layout 题目链接: Rhttp://acm.hust.edu.cn/vjudge/contest/122685#problem/S Description Like everyone else, ...

  9. POJ 3169 Layout 差分约束系统

    介绍下差分约束系统:就是多个2未知数不等式形如(a-b<=k)的形式 问你有没有解,或者求两个未知数的最大差或者最小差 转化为最短路(或最长路) 1:求最小差的时候,不等式转化为b-a>= ...

随机推荐

  1. 极客mysql06

    两阶段锁:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放, 而是要等到事务结束时才释放. 建议:如果你的事务中需要锁多个行,要把最可能造成锁冲突.最可能影响并发度的锁 ...

  2. 磁盘构造/msdos分区(fdisk)格式化(mkfs)和挂载

    分区不是必要的,分区是与系统盘分开,防止数据丢失. 磁盘使用流程:查看磁盘(fdisk -l)---分区---格式化(创建文件系统)----挂载(自动挂载) 分区表类型:msdos(一般是系统分区)  ...

  3. 支持jewel版本的calamari

    之前测试了下,发现calamari不支持jewel版本的,是因为接口了有了一些变化,在提出这个问题后,作者给出了回答,说肯定会支持的,并且做了一点小的改动,就可以支持了,这个作者merge了到了git ...

  4. samba配置用户访问方法

    配置目的: 为了给指定用户一个独立访问目录 首先在samba服务器安装samba软件 $ apt-get install samba 然后配置独立访问用户 配置samba用户前提需要是linux的用户 ...

  5. 痞子衡嵌入式:JLink Script文件基础及其在IAR下调用方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是JLink Script文件基础及其在IAR下调用方法. JLink可以说是MCU开发者最熟悉的调试工具了,相比于其他调试器(比如DAP ...

  6. SQL Server 2008-LinkServer操作ORACLE

    链接来源:https://www.cnblogs.com/wangyong/p/Oracle.html 最近项目有需求需要通过SQL Server2008中的数据自动更新到ORACLE中,其实,一开始 ...

  7. loadrunner 生成随机参数 Radom相关

    我也是刚开始进入测试行业,不过比较幸运的我之前做过开发,所以对代码比较熟悉,对loadrunner没有进行过系统的学习,也是通过自己的摸索慢慢的积累知识. 今天遇到项目中要我做一个压力测试,其中一些参 ...

  8. linux中使用head,tail,grep, sed,awk三种方法显示文档中间若干行(指定任意行)

    需要显示文本中间20-25行. 创建一个30行的文档,命名为30.txt并显示在屏幕 [root@v2-ui data]# seq 30 > 30.txt && cat 30.t ...

  9. 谈谈什么是MySQL的表空间?

    今天我要跟你分享的话题是:"大家常说的表空间到底是什么?究竟什么又是数据表?" 这其实是一个概念性的知识点,当作拓展知识.涉及到的概念大家了解一下就好,涉及的参数,留个印象就好. ...

  10. python学习-pickle模块(序列化)

    简介 1 python-pickle模块 该pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. "Pickling"是将Python对象层次结构转换为字节 ...