题意是给定n个数,定义一种运算为每次取当前数和下一个数的差的绝对值作为下一次运算的当前数

输出最小值,最大值以及对应的路径

感觉很犀利的一道题,但是比赛的时候AC率特别高...

我用了一个多小时才写出来,刚开始就想出来了递推步骤

受这几天刷的题的影响吧,第一反应是打表保存结果

我用vector保存,结果把我的电脑都跑死机了

开机后就想到了用一维数组即滚动数组优化来写

先说下分析过程:

令minv[i], maxv[i]分别保存i对应的最小值和最大值

不难想到:

maxv[i] = i - minv[i-1]
minv[i] = i -maxv[i-1]

那么这种思路对不对呢?观察下面的例子:

例如i==2时

minv[2] : 1 2

maxv[2]: 1 2

i == 3时

minv[3]: 1 2 3(错误!正确排列应该为:1 3 2)

maxv[3]: 1 2 3

所以求minv[i]时我们还要比较以下两种排列的大小:

minv[i-1]的前 i-1 项排列 + i

minv[i-1]的前 i-2 项排列 + i-1 + i

而对于maxv[i]则不需要额外的判定,只需在minv[i-1]的排列后+i即可

前8项的排列如下:

观察规律还可以发现最小值非0即1(与n*(n+1)/2 的奇偶性有关)

同样最大值非i即i-1(与n*(n-1)/2的奇偶性有关)

唯一的难点就在于打印路径了

我是用滚动数组的方法做的

不太好解释,直接看代码吧

代码如下:

#include <bits/stdc++.h>
#define MAXN 60010
#define LL long long
using namespace std;int n;
int minv[MAXN], maxv[MAXN];
vector<LL> res_min, res_max;void init(int n) {res_min.clear();res_max.clear();minv[1] = maxv[1] = 1;res_min.push_back(1);res_max.push_back(1);for(LL i=2; i<=n; ++i) {LL tmp = i*(i+1)/2;if(tmp % 2) minv[i] = 1;else minv[i] = 0;tmp -= i;if(tmp % 2) maxv[i] = i-1;else maxv[i] = i;//printf("maxv[%d] = %d\n", i, maxv[i]);if(i%2) {if(i-maxv[i-1] > 1) {res_min[i-2] = i;res_min.push_back(i-1);} else res_min.push_back(i);res_max.push_back(i);}else {if(i-maxv[i-1] > 1) {res_max[i-2] = i;res_max.push_back(i-1);} else res_max.push_back(i);res_min.push_back(i);}}}int main(void) {while(scanf("%d", &n) != EOF) {init(n);printf("%d %d\n", minv[n], maxv[n]);if(n%2)//i为奇数时,res_minv[i]中保存的是最小排列,反之res_maxv[i]中保存的是最小排列for(int i=0; i<n; ++i)printf("%lld ", res_min[i]);puts("");for(int i=0; i<n; ++i)printf("%lld ", res_max[i]);puts("");} else {for(int i=0; i<n; ++i)printf("%lld ", res_max[i]);puts("");for(int i=0; i<n; ++i)printf("%lld ", res_min[i]);puts("");}}return 0;
}

zoj 3798 Abs Problem(数学:推理+滚动数组)相关推荐

  1. [QLU Regular Contest 003] G.Youmu with greedy money problem //dp+滚动数组

    题目链接 题意: 给一个初始纯度值 m m m,一共度过 n n n天,给出序列 a [ i ] a[i] a[i]和 b [ i ] b[i] b[i],第 i i i天可以执行下列操作方案之一: ...

  2. 滚动数组~\(≧▽≦)/~

    今天第一次用了滚动数组,缘由要从一道题说起:POJ 1159 Palindrome 题意:给你一个字符串,求对字符串最少添加几个字符可变为回文串. 分析: 简单做法是直接对它和它的逆序串求最长公共子序 ...

  3. Gym 100507G The Debut Album (滚动数组dp)

    The Debut Album 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/G Description Pop-group & ...

  4. HDOJ 2602-Bone Collector(0/1背包模板、打印方案及滚动数组解法)

    0/1背包 一.Bone Collector 解法一:二维数组解法(0/1背包模板代码) 1.1 0/1背包打印方案代码 解法二:滚动数组(一维)解法 2.1 一维滚动数组例题 E-爱玩游戏的Tom ...

  5. PLM是做题家吗?一文速览预训练语言模型数学推理能力新进展

    ©作者 | 张北辰 单位 | 中国人民大学高瓴人工智能学院 数学推理能力是人类智能的一项非常重要又富有挑战性的能力.尽管在各类自然语言相关的理解和生成任务等中取得了良好的效果,预训练语言模型可以准确地 ...

  6. 动态规划/滚动数组/通项公式——爬楼梯

    一.题目 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 二.思路解析 1.迭代 第n个台阶只能从第n-1或者n-2个上来.到第 ...

  7. 关于滚动数组的一些初学随笔

    什么是滚动数组 简单来说,滚动数组就是一种具有短暂记忆力的数组,它会牺牲时间来节省空间,用size=3的数组来"存储"30000个数据.这么说有点离谱.抽象,毕竟a[3]怎么存储a ...

  8. 【bzoj 1806/CS 1801】矿工配餐 IOI2007(五维DP+滚动数组)

    楼下是传送门: http://www.lydsy.com/JudgeOnline/problem.php?id=1806 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦, ...

  9. 洛谷 P2679 子串 【dp神题】【滚动数组】【2015 noip d2t2】

    偷个懒,题解看这里:https://www.luogu.org/problemnew/solution/P2679 看作者 GuessYCB  写的 ===2018.9.6=== 这一次算理解深一点了 ...

最新文章

  1. php 构造 析构,php 构造方法和析构方法
  2. 【C++ Primer】类的多态
  3. 【UI】android如何绘制一个饼图
  4. python3一个中文3个字符_高手接招! 小应用 用python3判断一个字符串是不是中文组成的...
  5. 政策推动加速5G发展 全球统一标准成大势所趋
  6. 开源推荐:Asp.Net Core入门学习手册!
  7. 分组数据方差公式_连续变量假设检验 之 单因素方差检验
  8. 算法笔记_132:最大流量问题(Java)
  9. python缩进设计_Python 的缩进是不是反人类的设计?
  10. 内存映射第一步:idmap swapper
  11. Postgresql 创建主键并设置自动递增的三种方法
  12. 10G网络布线方案有多少种?
  13. think-cell丨Images图像丨教程
  14. C++语法篇之STL库
  15. Windows系统下VMware 虚拟机中文件提取到主机的方法
  16. 【网页期末作业】用HTML+CSS做一个漂亮简单的学校官网
  17. android wight
  18. 线上测评图形题技巧一
  19. Sametime SDK
  20. Supervisor启动java服务(jar)

热门文章

  1. EDIUS音频滤镜之低通滤波与高通滤波
  2. 嘘:年前最后一次福利,星球半价
  3. 区块链以及区块链技术入门详解(1)
  4. java毕业设计—— 基于java+JavaEE+jsp的售后服务管理系统设计与实现(毕业论文+程序源码)——售后服务管理系统
  5. windows开启telnet服务步骤
  6. 计算机毕业设计(附源码)python在线共享笔记系统
  7. Visual Studio中注释出现红色波浪纹
  8. scipy 中的whiten函数
  9. JavaScript(JS)制作网页--点击图片换背景
  10. ELK日志分析系统之ELK搭建部署