题目:
4262. 空调
Farmer John 的 NN 头奶牛对他们牛棚的室温非常挑剔。
有些奶牛喜欢温度低一些,而有些奶牛则喜欢温度高一些。
Farmer John 的牛棚包含一排 NN 个牛栏,编号为 1…N1…N,每个牛栏里有一头牛。
第 ii 头奶牛希望她的牛栏中的温度是 pipi,而现在她的牛栏中的温度是 titi。
为了确保每头奶牛都感到舒适,Farmer John 安装了一个新的空调系统。
该系统进行控制的方式非常有趣,他可以向系统发送命令,告诉它将一组连续的牛栏内的温度升高或降低 11 个单位——例如「将牛栏 5…85…8 的温度升高 11 个单位」。
一组连续的牛栏最短可以仅包含一个牛栏。
请帮助 Farmer John 求出他需要向新的空调系统发送的命令的最小数量,使得每头奶牛的牛栏都处于其中的奶牛的理想温度。
输入格式
输入的第一行包含 NN。
下一行包含 NN 个非负整数 p1…pNp1…pN,用空格分隔。
最后一行包含 NN 个非负整数 t1…tNt1…tN。
输出格式
输出一个整数,为 Farmer John 需要使用的最小指令数量。
数据范围
1≤N≤1051≤N≤105,
0≤pi,ti≤100000≤pi,ti≤10000
输入样例:
5
1 5 3 3 4
1 2 2 2 1
输出样例:
5
样例解释
一组最优的 Farmer John 可以使用的指令如下:
初始温度 :1 2 2 2 1
升高牛棚 2..5:1 3 3 3 2
升高牛棚 2..5:1 4 4 4 3
升高牛棚 2..5:1 5 5 5 4
降低牛棚 3..4:1 5 4 4 4
降低牛棚 3..4:1 5 3 3 4
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int p[N],t[N],n,b[N],d[N];
void insert(int l,int r,int c){
b[l]+=c;
b[r+1]-=c;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&t[i]);
}
for(int i=1;i<=n;i++){
d[i]=p[i]-t[i];//pt差值数组
insert(i,i,d[i]);//构造差分数组
}
//每次取一个正数一个负数,正-1,负+1;因为差分数组b(1~n+1)和为0-->说明正数和和负数和相等,即正数的和就是最终操作的结果数
int sum=0;
for(int i=1;i<=n+1;i++){
if(b[i]>0){
sum+=b[i];
}
}
cout<<sum<<endl;
return 0;
}
思路:
将题所求转换
两个数组只用管差值最后为0即可
一段区间+1或-1操作,可用差分对两个端点进行+1-1。差分数组最好到n+1这样最后差分数组和为0:说明正数和等于负数和。要使操作数最小,则取两个数,一个正数一个负数,正数+1,负数+1,最后记下来其操作的次数即可。其实就是最后的正数和是多少