题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3043

题意:

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

  求:(1)至少需要多少次操作才能使数列中的所有数都一样。

    (2)在保证最少次数的前提下,最终得到的数列有多少种。

题解:

  对于差分来说,给[l,r]+1(或-1)就是给差分数组s[l]+1和s[r+1]-1。

  所以数列a[i],是从一个所有元素都相等的初始数组,经过若干次差分操作得来的。

  因此可以求出a[i]的差分数组s[i]。

  因为要使操作次数最小,所以先让s[i]中的正数和负数配对(可能有剩余),每一对"+1"和"-1"对应一次操作。

  剩下来的正数(或负数),只能单独消去。

  pos为s[i]的正数之和,neg为s[i]的负数的绝对值之和。

  所以第(1)问的答案为max(pos,neg)。

  因为要使操作次数最小,所以配对的"+1"和"-1"一定会被消去,对于最终数列的种类没有影响。

  所以只用考虑剩下来的正数(或负数)的消去方法。

  对于一个在i位置的"+1"来说,有两种消去方法:

    (1)自己跟自己消,即在s[i]再-1。

      从效果上看,相当于给a[i]及后面的数都-1。

    (2)跟位置1消,即在s[i]处-1。

      相当于给[1,i]之间的数-1。

  对于这两种消去方法,最终数组的数字大小相差1。

  剩下的数共有abs(pos-neg)个。

  所以最终数组的数字大小最多相差abs(pos-neg),即数字种类有abs(pos-neg)+1种。

  abs(pos-neg)+1即为第(2)问答案。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 100005 using namespace std; int n;
long long pos=;
long long neg=;
long long a[MAX_N]; long long labs(long long x)
{
return x>?x:-x;
} void read()
{
cin>>n;
for(int i=;i<n;i++)
{
cin>>a[i];
}
} void solve()
{
for(int i=;i<n;i++)
{
if(a[i]>a[i-]) pos+=a[i]-a[i-];
else neg+=a[i-]-a[i];
}
} void print()
{
cout<<max(pos,neg)<<endl;
cout<<labs(pos-neg)+<<endl;
} int main()
{
read();
solve();
print();
}

最新文章

  1. Linked Server: EXECUTE permission denied on object 'xp_prop_oledb_provider', database 'master', owner 'dbo'
  2. png图片制作任意颜色的小图标
  3. 测试servlet学习笔记
  4. freemarker:简介
  5. 20145227 《Java程序设计》第5周学习总结
  6. Target Operator ID has No Access to Upgrade
  7. python 内建函数 type() 和 isinstance() 介绍
  8. SQL Server查询所有用户表
  9. Gwt ListBox选中自动触发事件
  10. lzo压缩格式文件查看
  11. ACE框架 同步原语设计
  12. TFS在项目中DevOps落地进程(下)
  13. 【zkw费用流】[网络流24题]餐巾计划问题
  14. QVM 实操记 - 18.12.28
  15. Ios项目添加Pods
  16. Android R文件介绍
  17. JDK 规范目录
  18. Elasticsearch基本原理分析
  19. 在Activity中响应ListView内部按钮的点击事件的两种方法
  20. Ubuntu14.04(server amd 64)编译安装 ceres-solver

热门文章

  1. 身份证识别接口编写的JAVA调用示例
  2. Android开发第一讲之目录结构和程序的执行流程
  3. Oracle 中session和processes的初始设置
  4. bit-map再显身手:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数。限制: 可用内存为600MB.
  5. Struts2学习六----------默认Action
  6. C语言 结构体作为函数的参数
  7. HDU 2473 Junk-Mail Filter 删点并查集
  8. Delphi列表控件TListView定位到某一行。
  9. JavaScript中setInterval用法
  10. Spring Boot: 加密应用配置文件敏感信息