差分约束系统——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>= ...
 
随机推荐
- explain命令---查看mysql执行计划
			
引言: 实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表.怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因 ...
 - 高性能arm运行ceph存储基准测试
			
关于arm 之前wdlab对外发布过一次约500个节点的arm的ceph集群,那个采用的是微集群的结构,使用的是双核的cortex-a9 ARM处理器,运行速度为1.3 GHz,内存为1 GB,直接焊 ...
 - 【Redis】利用 Redis 实现分布式锁
			
技术背景 首先我们需要先来了解下什么是分布式锁,以及为什么需要分布式锁. 对于这个问题,我们可以简单将锁分为两种--内存级锁以及分布式锁,内存级锁即我们在 Java 中的 synchronized 关 ...
 - HDU100题简要题解(2060~2069)
			
这十题感觉是100题内相对较为麻烦的,有点搞我心态... HDU2060 Snooker 题目链接 Problem Description background: Philip likes to pl ...
 - Linux文件监控工具——inotify-tools
			
举例: ip.txt内容如下: 10.1.1.11 root 123 10.1.1.22 root 111 10.1.1.33 root 123456 10.1.1.44 root 54321 写法1 ...
 - Java的比较器Comparable与Comparator
			
在Java中有两个比较器:Comparable.Comparator 对于Integer.Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序 ...
 - 用Python写一个病毒
			
WARNING 本文仅供学习和测试,请勿用于非法用途. 前言 花了挺长时间去开发的,中间有很多包是抄的,比如DDL注入.关于opencv等等,主要其实做了一些拼接.打包.部署. 写这篇博客并不真的想去 ...
 - 神秘、常用、多变的Binder
			
今天说说神秘又常用又多变的Binder~ Binder是什么 Binder通信过程和原理 在Android中的应用 Binder优势 Binder是什么 先借用神书<Android开发艺术探索& ...
 - Beyond Compare-这款检查图片工具真的绝了!
			
无论是出去旅游,还是参加聚会,在朋友圈分享美美的图片,已经成为了很多都市人的日常.在分享图片前,大多数人都会选择使用滤镜.风格等功能对照片进行一定的美化.但有时候美化的程度比较轻微,连修图的人都无法判 ...
 - 【VUE】8.VUEX核心概念
			
1. Vuex核心概念主要如下 state : 存储共享数据 mutation: 变更store中的数据,方法,不能异步操作 action: 异步操作,通过触发mutation变更数据 getter: ...