这道题是一道差分的题目

差分数组p即p[i]=a[i]-a[i-1]

如果我们把一个区间[l,r]里的数+1,那么我们不难发现p[l]'=a[l]+1-a[l-1]=p[l]+1,p[r+1]'=a[r+1]-(a[r]+1)=p[r+1]-1

即一次将两个p[i]+1 or -1

还有一种情况可以使p[l]+1 or -1

---------------差分数组介绍完毕-------------------------

首先我们看第一小问:输出最少操作次数使所有数相等,即令p[i]==0(i!=1)

我们可以根据之前得到的结论推广:

若 p[2]1,p[3]-2,那么我们最少需要两次操作;

若 p[2]1,p[3]-2,p[4]==4,那么我们最少需要五次操作;

若 p[2]1,p[3]-2,p[4]4,p[5]-2,那么我们最少需要五次操作;

......

不难看出,若把原p数组中正数之和表示为a,负数绝对值之和表示为b,那么我们最少需要max(a,b)次操作。

再看第二小题。

题目可以理解为:在一问的条件下,p[1]的值有多少种情况?

无需赘述,我们可以发现,当我们min(a,b)次操作后,数组p中定然只会剩下p[1]与一些同号的数。对于之后的|a-b|次操作,我们可以选择让p[1]变动或不变,这样一来p[1]的值就会有1+max(a,b)种可能的值。

完结撒花qwq~

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,a[101000],p[101000],z,f,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
p[i]=a[i]-a[i-1];
}
for(int i=2;i<=n;i++)
{
if(p[i]>0)
z+=p[i];
else
f-=p[i];
}
long long ans=abs(z-f),an=max(z,f);
cout<<an<<"\n"<<1+ans;
return 0;
}

最新文章

  1. 【原】iOS 同时重写setter和getter时候报错:Use of undeclared identifier &#39;_name&#39;;did you mean &#39;name&#39;
  2. 在线markdown编辑器
  3. Redis学习笔记-进阶
  4. java多线程系类:基础篇:06线程让步
  5. Javascript数据类型的一些注意点
  6. 在Eclipse ee中成功使用jQuery UI插件
  7. prototype原型链继承
  8. MVC-Area
  9. 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和
  10. LindDotNetCore~入门基础
  11. Unix系统的文件目录项的内容是什么,这样处理的好处是什么?
  12. Java多线程面试
  13. Python——pandas数据处理(python programming)
  14. JAVA遇上HTML-----JSP 篇基本概念
  15. Python小白学习之路(十)—【函数】【函数返回值】【函数参数】
  16. ARM上电启动及Uboot代码分析
  17. JDBC-DAO经典模式 实现对数据库的增、删、改、查
  18. python——socket模块与列表映射
  19. oracle获取时间毫秒数
  20. YCM的使用

热门文章

  1. CVPR2019论文解读:单眼提升2D检测到6D姿势和度量形状
  2. 面部表情视频中进行远程心率测量:ICCV2019论文解析
  3. 2020年Yann Lecun深度学习笔记(上)
  4. ADAS系统长篇综述(下)
  5. 自然语言推理:微调BERT
  6. Python字符与字节新编
  7. 【NX二次开发】uf5945获得旋转矩阵、uf5947根据变换矩阵移动或复制对象
  8. JUC并发包与容器类 - 面试题(一网打净,持续更新)
  9. OSPF多区域原理与配置
  10. Tkinter 吐槽之二:Event 事件在子元素中共享