差分约束系统——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>= ...
随机推荐
- 【JVM第六篇--对象】对象的实例化、内存布局和访问定位
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.对象的实例化 在平常写代码的过程中,我们用class关键字定义的类只是一个类的模 ...
- 说一说packet poll 错误掩码的一个bug tcp udp packet poll细节有所不同 处理时需要注意
今天处理一个cpu标高的bug,原因:在poll 返回后将error事件当做POLLIN事件处理,fd 一直都在唤醒线程处理,但是rcv的时候没有数据: unsigned int datagram_p ...
- kafka生产者数据可靠性保证
为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(ackn ...
- Android Support v4\v7\v13和AndroidX理解【转载】
为什么要用support库呢? 因为在低版本Android平台上开发一个APP时,想使用高版本才有的功能,此时就需要使用Support来支持兼容. 1. android-support-v4 comp ...
- EF Core 三 、 EF Core CRUD
EF Core CRUD 上篇文章中,我们已经基本入门了EFCore,搭建了一个简单的EFCore项目,本文开始简单使用下EF,做增删改查的相关操作: 一.数据新增操作(C) public stati ...
- 使用logisim搭建单周期CPU与添加指令
使用logisim搭建单周期CPU与添加指令 搭建 总设计 借用高老板的图,我们只需要分别做出PC.NPC.IM.RF.EXT.ALU.DM.Controller模块即可,再按图连线,最后进行控制信号 ...
- Java基础教程——二维数组
二维数组 Java里的二维数组其实是数组的数组,即每个数组元素都是一个数组. 每个数组的长度不要求一致,但最好一致. // 同样有两种风格的定义方法 int[][] _arr21_推荐 = { { 1 ...
- Mybatis【2.3】-- Mybatis一定要使用commit才能成功修改数据么?
代码直接放在Github仓库[https://github.com/Damaer/Mybatis-Learning],mybatis-02可直接运行,就不占篇幅了. 为什么我们有时候不使用commit ...
- kafka入门之broker-水印和leader epoch
每个kafka副本对象都持有2个重要的属性:日志末端位移LEO,高水印HW Kafka对leader副本和follower副本的LEO更新机制是不同的,后面我们会详细讨论. Kafka对leader副 ...
- dubbo起停之服务消费
ReferenceAnnotationBeanPostProcessor继承了AnnotationInjectedBeanPostProcessors其实现了InstantiationAwareBea ...