CSP认证201809-4 再卖菜[C++题解]:差分约束、前缀和
文章目录
- 题目解答
- 题目链接
题目解答
来源:acwing
分析:
对于a0,a1,...,ana_0, a_1,...,a_na0,a1,...,an,经过计算相邻的数的平均值得到b0,b1,...,bnb_0, b_1,...,b_nb0,b1,...,bn,现在给定序列b的值,反求序列a的值。
为了处理3者求和,我们使用前缀和的技巧求三个数或者2个数的和: ai−1+ai+ai+1=s[i+1]−s[i−2]a_{i-1}+a_i+a_{i+1} = s[i+1] - s[i-2]ai−1+ai+ai+1=s[i+1]−s[i−2]
其实,bi=⌊ai−1+ai+ai+13⌋=⌊s[i+1]−s[i−2]3⌋b_i = \lfloor \frac{a_{i-1}+a_i+a_{i+1}}{3}\rfloor= \lfloor \frac{s[i+1] - s[i-2]}{3}\rfloorbi=⌊3ai−1+ai+ai+1⌋=⌊3s[i+1]−s[i−2]⌋
等价于 3bi≤s[i+1]−s[i−2]≤3bi+2(1)3b_i \leq s[i+1] - s[i-2] \leq 3b_i +2 (1)3bi≤s[i+1]−s[i−2]≤3bi+2(1)
由于题目给定每个店铺的价格都是正整数
所以还有约束:s[i]−s[i−1]≥1(2)s[i] - s[i-1] \geq 1(2)s[i]−s[i−1]≥1(2)
得到了不等式约束,并且都是作差的形式,所以这是一道差分约束的题目。那么就要往spfa求最短路和最长路的角度去想。这里要求字典序最小的值,按照套路,这里要用最长路,所以三角不等式为:
dist[b]≥dist[a]+cdist[b] \geq dist[a] + cdist[b]≥dist[a]+c
对应的是a到b有一条权值为c的边。
所以我们对上面的(1)和(2)不等式约束进行变形,同时得到点、边权的关系:
(1)式可以拆成2个不等式:
s[i+1]≥s[i−2]+3bis[i+1] \geq s[i-2] + 3b_is[i+1]≥s[i−2]+3bi
对应的是i-2这个点到i+1这个点有一条权值为3bi3b_i3bi的边
s[i−2]≥s[i+1]−(3bi+2)s[i-2] \geq s[i+1] -(3b_i + 2)s[i−2]≥s[i+1]−(3bi+2)
对应的是i+1这个点到i-2这个点有一条权值为−(3bi+2)-(3b_i+2)−(3bi+2)的边
(2)式对应不等式:
s[i]≥s[i−1]+1s[i] \geq s[i-1] + 1 s[i]≥s[i−1]+1
对应的是i-1这个点到i这个点有一条权值为111的边
关于差分约束的板子
算法提高课-图论-差分约束- AcWing 1169. 糖果:spfa求单源最短路、差分约束
这里的最长路指的是,建立一个超级源点0号点,求出所有点到0号点的最长路,为啥求出最长路之后就是我们要求的值呢? 因为这里本质上求的是一系列不等式:
s[i]≥...≥s[0]≥0s[i] \geq... \geq s[0] \geq 0s[i]≥...≥s[0]≥0很多这样的不等式,我们取它们的交集即可。
每一个这样的不等式链路对应图中的一个最短路(或者最长路),这里是因为求的是最小值,用的是最长路。
ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 310, M = N * 3;
int n, m;
int h[N], e[M],w[M], ne[M], idx;
int dist[N], q[N];
int b[N];
bool st[N];void add(int a, int b, int c){e[idx] = b, w[idx] =c, ne[idx] = h[a], h[a] = idx ++;
}// SPFA求最长路
void spfa(){// 求最长路,需要初始化为-∞memset(dist,-0x3f, sizeof dist);queue<int> q;q.push(0);dist[0] = 0;while(q.size()){auto t = q.front();q.pop();st[t] = false;for(int i = h[t]; ~i; i = ne[i]){int j = e[i];if(dist[j] < dist[t] + w[i]){dist[j] = dist[t] + w[i];if(!st[j]){q.push(j);st[j] = true;}}}}
}int main(){memset(h, -1, sizeof h);cin >> n;for(int i = 1; i <= n; i ++) cin >> b[i];//除去端点值需要满足的条件for(int i = 2; i < n; i ++){add(i -2, i + 1, b[i] * 3 );add( i + 1, i - 2, -(b[i] * 3 + 2));}//端点需要满足的条件add(0, 2, b[1] * 2), add(2, 0, -(b[1] * 2 + 1));add(n - 2, n, b[n] * 2), add(n, n - 2, -(b[n] * 2 +1));// 所有点都满足的条件for(int i = 1; i <= n; i ++) add(i - 1, i, 1);// 求最长路spfa();for(int i = 1; i <= n; i ++)// 前缀和求某点的值cout << dist[i] - dist[i - 1] << " ";}
题目链接
https://www.acwing.com/problem/content/3268/
CSP认证201809-4 再卖菜[C++题解]:差分约束、前缀和相关推荐
- CCF201809-4 再卖菜
问题描述: 试题编号: 201809-4 试题名称: 再卖菜 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一 ...
- CCF201809-4 再卖菜(100分)【DFS】
试题编号: 201809-4 试题名称: 再卖菜 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第 ...
- [差分约束] AcWing-393 雇佣收银员 AcWing-2128 狡猾的商人 AcWing-3265 再卖菜
差分约束的大概样子 (大概) 差分约束一般是由特殊的n元一次不等式组组成的,它包含N个变量X1-Xn和M个约束条件,而且每个约束条件都是由两个变量做差组成的,形如,其中的ck是常数,它需要我们找到一组 ...
- CCF 差分约束--201809再卖菜
问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第一天,每个商店都自己定了一个正整数的价格.店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己 ...
- 180904 再卖菜 ccf
思路 dfs+去重 关键 满分的关键在于不同的前缀可能会遇到相同的情况,要直接排除这些情况,避免重复计算(单纯dfs只有80分) 实现 这里采用数组f来记录各种情况,通过traceback函数回溯 1 ...
- CCF201809-4 再卖菜
问题描述: AC代码: 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include ...
- [csp-201809-4]再卖菜 差分约束or记忆化搜索
先更新第一个做法:差分约束 转化成最长路,求出的每一个解是满足差分方程的最小值 spfa求最短路 对于边(x->y) 有: 1 if(dis[y] > dis[x] + a[i].d) d ...
- CSP认证201809-1 卖菜[C++题解]:遍历
文章目录 题目解答 题目链接 题目解答 来源:acwing 分析 :直接遍历即可,需要注意的小问题,用去尾法取整,直接转换为int即可. ac代码 #include<bits/stdc++.h& ...
- CSP认证201409-4 最优配餐[C++题解]:bfs、多源bfs、最短路、图论
文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 有很多起点S,同时有很多终点T,求每个终点到起点中最短的路,只要是到达其中一个起点就行.所以这是一个多源bfs的题目. ac代码 # ...
最新文章
- Linux crontab 命令格式
- 2016去哪儿编程题:乘坐公交
- tensorflow随笔-变量
- 微软技术专家为您解读深度学习
- 1011 A+B 和 C (15分)
- EOS Keosd概述
- 移动开发:怎么去掉点击时出现背景蓝色
- saspython知乎_银行业为什么喜欢用 sas 而不是 python?
- python毕业设计作品基于django框架校园网站系统毕设成品(6)开题答辩PPT
- 【ember zigbee】第三章:ug103-02-fundamentals-zigbee 学习笔记(中)
- 杜克大学中国女博士7年奋斗历程
- Android 百度地图api 问题 汇总
- JSP 银行网上账户管理系统myeclipse编程java网页
- Glide 源码解析之监听生命周期
- NAT基本原理与私有IP
- c语言字符串删掉小写字母
- tcl科技云计算机,科技点亮生活,TCL定义智慧科技新生活
- 基于微信小程序的游泳馆管理系统设计与实现-计算机毕业设计源码+LW文档
- C语言—超长正整数的乘法实现简洁版
- C语言 strcat 函数 - C语言零基础入门教程
热门文章
- 二.无显示器远程连接树莓派
- SAP B1在添加物料主数据时,出现错误提示‘xxxx代码已存在’的解决方法
- 用神经网络二分类吸引子与排斥子
- CNN 与 LSTM 模型复杂度分析
- 【控制】遗传算法(GA,Genetic Algorithm)及 Matlab 实现 代码详细版
- STM32 基础系列教程 14 - IIC
- ubuntu18.04安装VCS+verdi错误集锦
- Ubuntu 12.04 下编译Android 4.0.3
- android之broadcast发送广播
- 【PC工具】更新简单好用绿色IP地址扫描工具,内部网络设备查看工具,内网ip查询ip扫描工具,电脑IP地址查看方法...