先更新第一个做法:差分约束

转化成最长路,求出的每一个解是满足差分方程的最小值

spfa求最短路

对于边(x->y) 有:

if(dis[y] > dis[x] + a[i].d) dis[y]=dis[x]+a[i].d;

dis[y]的初始值为INF,dis[y]会是满足所有约束条件之中所有可能的值之中最大的(更新到最大的就不会再更新了)。

贴一个简略的证明:

同理,最长路求出来的是所有可能解之中最大的。

这题是字典序最小,那么我们要转化成最长路来求,求到的每个s[i]都是可能的值中最小的一个。注意,菜价要是正整数(>=1)。

 #include<bits/stdc++.h>
using namespace std; const int N=;
struct node{
int x,y,d,next;
}a[*N];
int n,al,first[N],b[N],s[N];
bool vis[N];
queue<int> q; void ins(int x,int y,int d)
{
al++;
a[al].x=x;a[al].y=y;a[al].d=d;
a[al].next=first[x];first[x]=al;
} void build_edge()
{
al=;
memset(first,,sizeof(first));
ins(,,*b[]);
ins(,,-(*b[]+));
for(int i=;i<=n-;i++)
{
ins(i-,i+,*b[i]);
ins(i+,i-,-(*b[i]+));
}
ins(n-,n,*b[n]);
ins(n,n-,-(*b[n]+));
for(int i=;i<=n;i++) ins(i-,i,);
} void spfa()
{
while(!q.empty()) q.pop();
memset(s,,sizeof(s));
memset(vis,,sizeof(vis));
s[]=;vis[]=;q.push();
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(s[y]<s[x]+a[i].d)
{
s[y]=s[x]+a[i].d;
if(!vis[y])
{
vis[y]=;
q.push(y);
}
}
}
vis[x]=;
}
} int main()
{
//freopen("a.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&b[i]);
build_edge();
spfa();
for(int i=;i<=n;i++)
printf("%d ",s[i]-s[i-]);printf("\n");
return ;
}

[csp-201809-4]再卖菜 差分约束or记忆化搜索的更多相关文章

  1. CCF(再卖菜60分)爆搜+记忆化搜索+差分约束

    201809-4 再卖菜 我使用的是爆搜解决,只得了60分. 记忆化搜索 差分约束 #include<iostream> #include<cstdio> #include&l ...

  2. CCF-CSP题解 201809-4 再卖菜

    碎碎念..近视加老花,还以为第二天除了第二家范围在100以内别的都不确定,于是x**算的记搜复杂度超时了.还鼓捣着什么差分区间最长路,虽然有大神用差分区间做出来了,然而自己并没有看懂. 其实就是一个记 ...

  3. 再谈记忆化搜索 HDU-1078

    最近做DP题目,发现无论是LCS,还是有些题目涉及将动态规划的路径打印出来,而且有时候还要按格式输出,这个时候,记忆化搜索显得尤其重要,确实,记忆化搜索使用优化版本的动态规划,用起来思路清晰,非常方便 ...

  4. ccf 201809-4 再卖菜

    这题一开始不知道剪枝这种操作,只会傻傻地dfs. 然后dfs递归写80分超时,非递归写70分超时(纳尼?我一直以为非递归算法在时间上会更优秀一些,为什么会这样?!!) 剪一下枝就都能过了 #inclu ...

  5. ccf再卖菜

    https://blog.csdn.net/imotolove/article/details/82777819 记忆化搜索,还不太理解..

  6. ccf 再买菜 搜索 dfs

    //递推关系式:(b[n-1]+b[n]+b[n+1])/3=a[n] //所以b[n+1]=3*a[n]-b[n-1]-b[n],或b[n+1]=3*a[n]-b[n-1]-b[n]+1,或b[n+ ...

  7. 【转】最短路&差分约束题集

    转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...

  8. 转载 - 最短路&差分约束题集

    出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548    A strange lift基础最短路(或bfs)★ ...

  9. CCF CSP 201809-1 卖菜

    题目链接:http://118.190.20.162/view.page?gpid=T79 问题描述 试题编号: 201809-1 试题名称: 卖菜 时间限制: 1.0s 内存限制: 256.0MB ...

随机推荐

  1. flex 布局能解决的问题

    flex 布局,可以解决元素在容器中的对齐.方向.顺序,甚至它们是动态的或者不确定大小的新布局模型.Flex容器的主要特征是能够调整其子元素在不同的屏幕大小中能够用最适合的方法填充合适的空间 . 转载 ...

  2. NodeJs 遍历文件夹内容 上传到服务器.并输出上传记录文件

    var path = require('path'); var glob = require('glob') var fs = require('fs'); var Promise = require ...

  3. Redis (二)_ jedis的使用

    Jedis 是 Redis 官方首选的 Java 客户端开发包 虚拟机设置 查看虚拟机的ip ifconfig 将虚拟机的6379端口打开 #运行下面的命令 如果是新建的一个新的 文件,你需要先安装 ...

  4. rpc 协议规范 之 rmi http webservice 和 一些框架

    RPC(Remote Procedure Call)是远程调用,是一种思想,也是一种协议规范.简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务,可以应用在分布式服务.分布式计算.远程服务调 ...

  5. java异常处理-finally中使用return和throw语句

    java异常语句中的finally块通常用来做资源释放操作,如关闭文件.关闭网络连接.关闭数据库连接等.正常情况下finally语句中不应该使用return语句也不应该抛出异常,以下讨论仅限于java ...

  6. php三种方法从控制结构或脚本中跳出

    PHP中,如果希望停止一段代码,根据需要达到的效果不同,可以有三种方法实现: 1. break: 如果在循环中使用了break语句,脚本就会从循环体后面的第一条语句开始执行: 2. continue: ...

  7. spring通过工厂模式解决页面耦合问题

    spring通过工厂模式解决页面耦合问题

  8. 如何合理的规划jvm性能调优

    JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了更好的理解本篇所介绍的内 ...

  9. 洛谷 P1270 “访问”美术馆 解题报告

    P1270 "访问"美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向 ...

  10. linux下tar.gz、tar、bz2、zip等解压缩、压缩命令

    转至:http://www.jb51.net/LINUXjishu/43356.html 说明:Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令 ...