所需知识:差分
思路:由于题目说明可以将连续一段区间的温度加或者减一个单位,很容易想到了用差分来做这道题,可以将理想温度与原有温度相减,然后在构造出相减之后的数组的差分数组,最终要使差分数组全部为0就行了(即使原有温度与理想温度的差值为0)
N | 1 | 2 | 3 | 4 | 5 |
原有温度: | 1 | 2 | 2 | 2 | 1 |
理想温度: | 1 | 5 | 3 | 3 | 4 |
需操作的数组 | 0 | 3 | 1 | 1 | 3 |
差分数组 | 0 | 3 | -2 | 0 | 2 |
所需的操作步数:max(正数和,负数和的绝对值);
例:将3将去2,将-2加上2,此时差分数组为:
差分数组 | 0 | 1 | 0 | 0 | 2 |
最后将所有正数减去,(减一为操作一次),若为负数则加一;
最终得出结论。
C++代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int n =100005;
int N;
int W[n],b[n],c[n];
int a=0,d=0;
int main()
{
cin>>N;
for (int i = 1; i <= N; i ++ ){
cin>>W[i];
}
for (int i = 1; i <= N; i ++ ){
int L;
cin>>L;
b[i]=L-W[i];
c[i]=b[i]-b[i-1];if(c[i]>0) a+=c[i];
else d-=c[i];
}
cout<<max(a,d);
return 0;
}