博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【AcWing】100. IncDec序列
阅读量:5081 次
发布时间:2019-06-12

本文共 1087 字,大约阅读时间需要 3 分钟。

给定一个长度为 n的数列 a1,a2,,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。

求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。


tips:

  1.进行问题求解的等价转换---对a数组区间的操作等价转换为对b数组其中两个元素(端点)的操作

  2.数据范围求和后可能爆,用 long long

  3.变成一样的,只考虑2...n---由b数组的定义可知,b[1]=a[1];其他b[i]=a[i]-a[i-1];

     代码中直接用a的空间来存b了,b[i]存储记录的是a[i]比a[i-1]大的相关信息,对a[i]和a[i-1]的相对大小关系进行了建模。

  4.差分+贪心;差分:前缀和的逆运算

  5.对每次操作的区间进行了范围讨论[i,j]是否在[2,n];

  6.求最小次数下的方案数最后成为一个排列组合问题

  7.疑问:为什么不考虑最后m对应的b数组的几个位置??

其他好的题解:


#include 
#include
using namespace std;typedef long long LL;const int N = 100010;int a[N];int main(){ int n; cin >> n; for (int i = 1; i <= n; i ++ ) cin >> a[i]; for(int i = n; i > 1; i --) a[i] = a[i] - a[i-1];//倒着处理--mark LL pos = 0, neg = 0; for (int i = 2; i <= n; i++ ) if (a[i] > 0 ) pos += a[i]; else neg-=a[i]; //求负数的绝对值之和 cout << min(pos, neg) + abs(pos - neg) << endl; cout << abs(pos - neg) + 1 << endl; return 0; }
View Code

 专注于过程,沉浸其中。对于终究要做的事,要选择性的忽略这件事消耗的时间,赶紧去做,告别拖延。

转载于:https://www.cnblogs.com/SUMaywlx/p/10765795.html

你可能感兴趣的文章
用JS制作博客页面背景随滚动渐变的效果
查看>>
JavaScript的迭代函数与迭代函数的实现
查看>>
一步步教你学会browserify
查看>>
Jmeter入门实例
查看>>
亲近用户—回归本质
查看>>
中文脏话识别的解决方案
查看>>
CSS之不常用但重要的样式总结
查看>>
Python编译错误总结
查看>>
URL编码与解码
查看>>
日常开发时遇到的一些坑(三)
查看>>
Eclipse 安装SVN插件
查看>>
深度学习
查看>>
TCP粘包问题及解决方案
查看>>
构建之法阅读笔记02
查看>>
添加按钮
查看>>
移动端页面开发适配 rem布局原理
查看>>
Ajax中文乱码问题解决方法(服务器端用servlet)
查看>>
会计电算化常考题目一
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>