文章目录

  • 题目解答
  • 题目链接

题目解答


来源: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++题解]:差分约束、前缀和相关推荐

  1. CCF201809-4 再卖菜

    问题描述: 试题编号: 201809-4 试题名称: 再卖菜 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一 ...

  2. CCF201809-4 再卖菜(100分)【DFS】

    试题编号: 201809-4 试题名称: 再卖菜 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第 ...

  3. [差分约束] AcWing-393 雇佣收银员 AcWing-2128 狡猾的商人 AcWing-3265 再卖菜

    差分约束的大概样子 (大概) 差分约束一般是由特殊的n元一次不等式组组成的,它包含N个变量X1-Xn和M个约束条件,而且每个约束条件都是由两个变量做差组成的,形如,其中的ck是常数,它需要我们找到一组 ...

  4. CCF 差分约束--201809再卖菜

    问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第一天,每个商店都自己定了一个正整数的价格.店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己 ...

  5. 180904 再卖菜 ccf

    思路 dfs+去重 关键 满分的关键在于不同的前缀可能会遇到相同的情况,要直接排除这些情况,避免重复计算(单纯dfs只有80分) 实现 这里采用数组f来记录各种情况,通过traceback函数回溯 1 ...

  6. CCF201809-4 再卖菜

    问题描述: AC代码: 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include ...

  7. [csp-201809-4]再卖菜 差分约束or记忆化搜索

    先更新第一个做法:差分约束 转化成最长路,求出的每一个解是满足差分方程的最小值 spfa求最短路 对于边(x->y) 有: 1 if(dis[y] > dis[x] + a[i].d) d ...

  8. CSP认证201809-1 卖菜[C++题解]:遍历

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析 :直接遍历即可,需要注意的小问题,用去尾法取整,直接转换为int即可. ac代码 #include<bits/stdc++.h& ...

  9. CSP认证201409-4 最优配餐[C++题解]:bfs、多源bfs、最短路、图论

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 有很多起点S,同时有很多终点T,求每个终点到起点中最短的路,只要是到达其中一个起点就行.所以这是一个多源bfs的题目. ac代码 # ...

最新文章

  1. Linux crontab 命令格式
  2. 2016去哪儿编程题:乘坐公交
  3. tensorflow随笔-变量
  4. 微软技术专家为您解读深度学习
  5. 1011 A+B 和 C (15分)
  6. EOS Keosd概述
  7. 移动开发:怎么去掉点击时出现背景蓝色
  8. saspython知乎_银行业为什么喜欢用 sas 而不是 python?
  9. python毕业设计作品基于django框架校园网站系统毕设成品(6)开题答辩PPT
  10. 【ember zigbee】第三章:ug103-02-fundamentals-zigbee 学习笔记(中)
  11. 杜克大学中国女博士7年奋斗历程
  12. Android 百度地图api 问题 汇总
  13. JSP 银行网上账户管理系统myeclipse编程java网页
  14. Glide 源码解析之监听生命周期
  15. NAT基本原理与私有IP
  16. c语言字符串删掉小写字母
  17. tcl科技云计算机,科技点亮生活,TCL定义智慧科技新生活
  18. 基于微信小程序的游泳馆管理系统设计与实现-计算机毕业设计源码+LW文档
  19. C语言—超长正整数的乘法实现简洁版
  20. C语言 strcat 函数 - C语言零基础入门教程

热门文章

  1. 二.无显示器远程连接树莓派
  2. SAP B1在添加物料主数据时,出现错误提示‘xxxx代码已存在’的解决方法
  3. 用神经网络二分类吸引子与排斥子
  4. CNN 与 LSTM 模型复杂度分析
  5. 【控制】遗传算法(GA,Genetic Algorithm)及 Matlab 实现 代码详细版
  6. STM32 基础系列教程 14 - IIC
  7. ubuntu18.04安装VCS+verdi错误集锦
  8. Ubuntu 12.04 下编译Android 4.0.3
  9. android之broadcast发送广播
  10. 【PC工具】更新简单好用绿色IP地址扫描工具,内部网络设备查看工具,内网ip查询ip扫描工具,电脑IP地址查看方法...