差分笔记以前就做了,在这我就不再写一遍了,直接上例题。

- #include
- 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)<
- return 0;
- }
题目要求同时将一段子数组全部加上1或者减去1, 直觉上就考虑采用差分数组的思想, 将原数组每一项的原始温度减去目标温度, 得到每一项需要改变的数值, 然后求出该数组的差分数组, 目标是使得差分数组的每一项变成0, 我们的操作方式有2种:选择任意两项, 一项加1, 另一项减1选择任意一项加1或者减1显然, 使数组全部变为0的最少操作方案就是 差分数组中负数和与正数和的绝对值的最大值。