前言:
差分笔记以前就做了,在这我就不再写一遍了,直接上例题。
例题:
#include<bits/stdc++.h>
using namespace std;
int a[10009],b[100009];
int main(){
int n,ans1=0,ans2=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
a[i]=a[i]-b[i];
}
for(int i=n;i>=1;i--){
a[i]=a[i]-a[i-1];
if(a[i]>0)ans1+=a[i];
else ans2-=a[i];
}
cout<<max(ans1,ans2)<<endl;
return 0;
}
题目要求同时将一段子数组全部加上1或者减去1, 直觉上就考虑采用差分数组的思想, 将原数组每一项的原始温度减去目标温度, 得到每一项需要改变的数值, 然后求出该数组的差分数组, 目标是使得差分数组的每一项变成0, 我们的操作方式有2种:选择任意两项, 一项加1, 另一项减1选择任意一项加1或者减1显然, 使数组全部变为0的最少操作方案就是 差分数组中负数和与正数和的绝对值的最大值。