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

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

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

作为蒟蒻,当然是不会加二分优化的啦...但是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. Socket accept 简要分析

    accept 用于从指定套接字的连接队列中取出第一个连接,并返回一个新的套接字用于与客户端进行通信,示例代码如下 #include <sys/types.h> /* See NOTES * ...

  2. Tomcat口令暴力猜解&&后台getshell

    Tomcat环境搭建 windows系统xampp搭建tomcat linux yum搭建tomcat 修改tomcat目录下的conf/tomcat-users.xml文件开启管理后台口令认证 &l ...

  3. [代码审计]:PhpMyWind储存型XSS漏洞(CVE-2017-12984)

    简介 今天开启一下代码审计的篇章  python安全编程剩下的看起来没意思就结束了 ,现在规划每2周写一个爬虫练练手, 然后今天开启代码审计和Docker的学习 我个人感觉先看漏洞利用过程再看漏洞分析 ...

  4. 微信小程序生成二维码并且扫码跳转并且携带参数

    话不多说,直接上代码,直接把APPID和APPSECRET改成自己的就能用了 <?php header('content-type:text/html;charset=utf-8'); //配置 ...

  5. 查看php扩展

    php -m

  6. 痞子衡嵌入式:揭秘i.MXRT600的ISP模式下用J-Link连接后PC总是停在0x1c04a的原因(Debug Mailbox)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT600中的Debug Mailbox实现对JLink调试的影响. 事情缘起痞子衡的同事 - 喜欢打破砂锅问到底的Kerry小 ...

  7. vue路由参数的获取、添加和替换

    获取路由参数 getUrlKey(name){//获取url 参数 return decodeURIComponent((new RegExp('[?|&]'+name+'='+'([^&am ...

  8. 深度分析ReentrantLock源码及AQS源码,从入门到入坟,建议先收藏!

    一.ReentrantLock与AQS简介 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:Reentra ...

  9. 思维导图VS金字塔原理

    作为常识,思维导图制作的核心元素是关键词,而金字塔原理制作的核心元素则是拓展的概要句子,这两种方式是当今人们常用的思维工具,本文对其做了对比,希望对你的选择有所帮助. 金字塔原理结构:从上到下三角形结 ...

  10. vulnhub: DC 9

    信息收集: root@kali:/opt/test# nmap -A -v 192.168.76.137 Starting Nmap 7.80 ( https://nmap.org ) at 2020 ...