Problem - 1453B - Codeforces

题意: 一个数组,每次可以选择一个后缀,将其加一或者减一,开始的时候可以免费改变一个数的数值,判断让所有数字相等所需要的最小操作数。

题解: 注意它的操作,每次改变的是一个后缀,不是自己随意选择子区间(开始读错题,一直没看懂.....),首先我们不考虑免费改变的那次,很明显,如果让所有数相同,肯定要都等于第一个,因为每次改变的是一个后缀,如果你最后变成的不是第一个数,那么你要变成的呢个数的前面的数一定会影响后面数,而且,每次改变后缀,那么后面的各个数之间的差值一定是不变的,求出开始值,然后判断要改变哪一个位置的数,求出最小值即可。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=2e5+10;
const ll mod=1e9+7;
ll cnt;
ll a[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
ll t;cin>>t;
while(t--){
ll n;cin>>n;
ll sum=0,ans;
for(ll i=1;i<=n;i++){
cin>>a[i];
if(i>=2) sum+=abs(a[i]-a[i-1]);//求出不用免费的那一次的最小值
}
ans=sum;
for(ll i=2;i<=n-1;i++){
ans=min(ans,sum-abs(a[i]-a[i-1])-abs(a[i]-a[i+1])+abs(a[i-1]-a[i+1]));//改变该位置的值,会影响前后两个数
}
ans=min(ans,sum-abs(a[2]-a[1]));//第一个数和最后一个数特判一下
ans=min(ans,sum-abs(a[n]-a[n-1]));
cout<<ans<<endl;
}
}

最新文章

  1. 运行page页面时的事件执行顺序
  2. Linux下使用iostat 监视I/O状态
  3. 最长不下降子序列(LIS)
  4. U盘制作Ubuntu15.04启动盘失败
  5. 第二章 管理程序流(In .net4.5) 之 管理多线程
  6. ThreadPoolTaskExecutor异步的处理报警发送邮件短信比较耗时的东东
  7. sqlserver中GUID的默认值设置
  8. 模拟在table中移动鼠标,高亮显示鼠标所在行
  9. javascript回调函数
  10. poj 1088 滑雪问题
  11. 【SDK编程】
  12. contact表单错误解决记录
  13. 如何使用 AngularJS 的 ngShow 和 ngHide
  14. 20160223.CCPP体系详解(0033天)
  15. spring与junit整合测试
  16. 抓包和测试Api类工具
  17. springcloud hystrix 部分参数整理
  18. django搭建一个小型的服务器运维网站-拿来即用的bootstrap模板
  19. EditPLus添加到右键图文教程
  20. 解决虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题

热门文章

  1. 我的开源之路:耗时 6 个月发布线程池框架,GitHub 1.7k Star!
  2. Python Socket Sever
  3. SAP Office Excel Intergration
  4. Linux IO重定向和管道
  5. halcon数组的一些使用
  6. CRM汇客 牛刀小试 5个BUG修复
  7. 乐观锁和悲观锁在kubernetes中的应用
  8. VGA设计(原理说明。Verilog代码实现,仿真结果)
  9. 单调栈_Largest Rectangle in a Histogram
  10. tarjan算法和缩点