CF-1453B
2024-10-20 05:37:42
题意: 一个数组,每次可以选择一个后缀,将其加一或者减一,开始的时候可以免费改变一个数的数值,判断让所有数字相等所需要的最小操作数。
题解: 注意它的操作,每次改变的是一个后缀,不是自己随意选择子区间(开始读错题,一直没看懂.....),首先我们不考虑免费改变的那次,很明显,如果让所有数相同,肯定要都等于第一个,因为每次改变的是一个后缀,如果你最后变成的不是第一个数,那么你要变成的呢个数的前面的数一定会影响后面数,而且,每次改变后缀,那么后面的各个数之间的差值一定是不变的,求出开始值,然后判断要改变哪一个位置的数,求出最小值即可。
代码:
#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;
}
}
最新文章
- 运行page页面时的事件执行顺序
- Linux下使用iostat 监视I/O状态
- 最长不下降子序列(LIS)
- U盘制作Ubuntu15.04启动盘失败
- 第二章 管理程序流(In .net4.5) 之 管理多线程
- ThreadPoolTaskExecutor异步的处理报警发送邮件短信比较耗时的东东
- sqlserver中GUID的默认值设置
- 模拟在table中移动鼠标,高亮显示鼠标所在行
- javascript回调函数
- poj 1088 滑雪问题
- 【SDK编程】
- contact表单错误解决记录
- 如何使用 AngularJS 的 ngShow 和 ngHide
- 20160223.CCPP体系详解(0033天)
- spring与junit整合测试
- 抓包和测试Api类工具
- springcloud hystrix 部分参数整理
- django搭建一个小型的服务器运维网站-拿来即用的bootstrap模板
- EditPLus添加到右键图文教程
- 解决虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题