问题描述:

AC代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<map>
 5 #include<set>
 6 #include<vector>
 7 #include<algorithm>
 8 #include<cmath>
 9 #include<fstream>
10 #include<iomanip>
11 #include<queue>
12 #include<unordered_set>
13 using namespace std;
14 typedef long long ll;
15 typedef unsigned long long ull;
16 const ll maxn = 300 + 5;
17 int target;
18
19 int num = 1;
20
21 int a[maxn], b[maxn];
22 bool f[maxn][maxn][maxn];
23
24 void dfs(int n, int x, int y){
25     if(f[n][x][y])return;
26     f[n][x][y] = true;
27     if(n == target - 1){
28         for(int i = 0; i <= 2; i++){
29             if((3 * a[n] - b[n - 1] + i) / 2 == a[n + 1]){//原等式 应为 2 * a[n + 1] (+1) = 3 * a[n] - b[n - 1](+1) (+2)  其中括号为可选项,代码里左边等式的 +1 消失了是因为有 /2 的存在。
30                 b[n + 1] = 3 * a[n] - b[n - 1] - b[n] + i;
31                 for(int i = 1; i <= target; i++){
32                     cout << b[i] << " ";
33                 }
34                 exit(0);
35             }
36         }
37     }
38     for(int i = 0; i < 3; i++){
39         b[n + 1] = 3 * a[n] - b[n] - b[n - 1] + i;
40         if(b[n + 1] >= 1)dfs(n + 1, y, b[n + 1]);
41     }
42     return;
43 }
44
45
46 int main(){
47 //    ios::sync_with_stdio(false);
48 //    ifstream cin("data.txt");
49 //    freopen("data.txt", "r", stdin);
50     memset(f, false, sizeof(f));
51     int n;
52     cin >> n;
53     target = n;
54     for(int i = 1; i <= n; i++){
55         cin >> a[i];
56     }
57     for(int i = 1; i <= 2 * a[1]; i++){
58         b[1] = i;
59         if(i != 2 * a[1]){
60             b[2] = 2 * a[1] - i;
61             dfs(2, b[1], b[2]);
62         }
63         b[2] = 2 * a[i] - i + 1;
64         dfs(2, b[1], b[2]);
65     }
66     return 0;
67 }

我想说的:

  很菜很菜的我在绝望搜题解之前是懵逼的,搜了几篇题解都是 差分约束 的解法,然而,看到了这篇博客  https://blog.csdn.net/imotolove/article/details/82777819 ,让我眼前一亮!对啊,可以暴力的啊!

   我们的思路就是:

   假设 b[] 为所求 a[] 为已知。
   我们把不等式写出来可以得到递推式:3 * a[n] <= b[n + 1] + b[n - 1] + b[n] <= 3 * a[n] + 2
   即, 我们知道 b[n - 1]、 b[n] 时 只需枚举 0, 1, 2即可得到 b[n + 1]
   对于起始和结束的特殊情况, 改写上式。

   对于起始的 b[1] 和 b[2], 我们知道 2 * a[1] <= b[1] + b[2] <= 2 * a[1] + 1
   即我们只需从 1 到 2 * a[1]枚举 b[1] 即可确定 两个初值
   对于最后的值 b[target] , 我们需保证 同时 满足 两个式子 才能 确定最后一个值

   对于 dfs的有效性:
   我们按递推式去推 b[],若可以推出来,则一定符合题意(因为递推式是满足题意的),
   否则,中间某值出现小于 1 的情况 或者 最后的值不符合两个不等式,都会记忆下然后退出来。
   每次碰到之前记忆过得情况时,直接退出, 因为之前通过这条路走不通没必要浪费时间。

   对于字典序的解释:
   我们是依次从小到大从前往后搜的,所以第一次满足题意的解 也 一定满足了字典序最小的要求。

   最后再鸣谢一下这位CSDN博主给我的启发:

转载于:https://www.cnblogs.com/peichaoL/p/10467602.html

CCF201809-4 再卖菜相关推荐

  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. 180904 再卖菜 ccf

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

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

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

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

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

  7. CSP认证201809-4 再卖菜[C++题解]:差分约束、前缀和

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 对于a0,a1,...,ana_0, a_1,...,a_na0​,a1​,...,an​,经过计算相邻的数的平均值得到b0,b1, ...

  8. 社区团购热潮退却,谁是电商卖菜“接盘侠”?

    是人是鬼,日久见分晓. 风风火火的社区团购,随着监管利刃的到来.补贴大战的叫停,最终沉寂下来.巨头们开始纷纷逃离,十荟团寻不到融资.同程生活关停.橙心优选传被并入京东体系.美菜网缩减战线...炙手可热 ...

  9. 年薪30万+!卖菜小哥到高薪程序员之路,我的三种人生境界

    王国维先生曾说过,古今之成大事业.大学问者,必经过三种之境界. 而我的转型之路,同样也经历了三种境界,走出迷茫区的我蓦然回首,测试打开了我人生中的全新方向,也给予了我努力与奋斗的目标. 从卖菜小哥到高 ...

最新文章

  1. OpenAI发布最新「模拟机器人环境」,用「真实机器人」模型进行训练
  2. 收藏|图神经网络综述
  3. Android之内存管理-内存监测-内存优化
  4. nyoj 947 Max Xor(字典树)
  5. 机器学习 -- 信息论
  6. oracle 计算中位数,SQL 如何计算每个分组的中位数
  7. Wordpress prettyPhoto插件跨站脚本漏洞
  8. Visio主题与样式
  9. 在线HTTP请求/响应头转JSON工具
  10. 拓端tecdat|R语言弹性网络Elastic Net正则化惩罚回归模型交叉验证可视化
  11. Hack the box -- 靶机渗透测试(TIER2)
  12. 悉尼大学计算机专业新生,2020年悉尼大学计算机科学专业课程设置难不难
  13. R 回归 虚拟变量na_R语言实战之R语言基础语法精讲(三)
  14. 【SEO案例】百度快照劫持怎么处理
  15. 如何打开管理员命令提示符窗口?
  16. 《码农的爱情》第一章又逢情人节
  17. php tipask yii 单点登录_favorite-link/README.md at master · cccthon/favorite-link · GitHub
  18. (笔记本)电脑WLAN 点不开,显示WLAN 已关闭。
  19. pandas 处理缺失值[dropna、drop、fillna]
  20. java clip_java – 使用Clip对象播放多个声音片段

热门文章

  1. 大数据应用型产品设计方法及行业案例介绍(附110页PPT)
  2. Android实现网络图片app
  3. HR面试问题-离职原因
  4. WZOI-272友谊
  5. 九龙证券|光模块概念股封单资金超3亿元,传媒板块涨停潮来袭
  6. 微信小程序开发校园论坛网站+后台
  7. java获取上周一_java 如何获取 上周一日期,上周末日期,本周一日期。
  8. Ubuntu20.04安装中国版firefox
  9. Ubuntu上安装R和rstudio-server
  10. 史上最详细的 Windows 10 ApacheTomcat 安装 后续 环境配置 + 微解 (狗头保个命)