蓝桥杯——空调(差分和贪心)C语言

文章讲述了FarmerJohn如何使用新空调系统,通过发送命令改变一组连续牛栏的温度,以使所有奶牛的牛栏达到它们各自理想的温度,通过计算目标温度与初始温度的差值并利用差分数组找到最少指令次数。
摘要由CSDN通过智能技术生成

Farmer John 的 N 头奶牛对他们牛棚的室温非常挑剔。

有些奶牛喜欢温度低一些,而有些奶牛则喜欢温度高一些。

Farmer John 的牛棚包含一排 N个牛栏,编号为 1…N,每个牛栏里有一头牛。

第 i头奶牛希望她的牛栏中的温度是 pi,而现在她的牛栏中的温度是 ti。

为了确保每头奶牛都感到舒适,Farmer John 安装了一个新的空调系统。

该系统进行控制的方式非常有趣,他可以向系统发送命令,告诉它将一组连续的牛栏内的温度升高或降低 11 个单位——例如「将牛栏 5…85…8 的温度升高 11 个单位」。

一组连续的牛栏最短可以仅包含一个牛栏。

请帮助 Farmer John 求出他需要向新的空调系统发送的命令的最小数量,使得每头奶牛的牛栏都处于其中的奶牛的理想温度。

输入格式

输入的第一行包含 N。

下一行包含 N个非负整数 p1…pN,用空格分隔。

最后一行包含 N个非负整数 t1…tN。

输出格式

输出一个整数,为 Farmer John 需要使用的最小指令数量。

数据范围

1≤N≤10^5
0≤pi,ti≤100000

输入样例:
5
1 5 3 3 4
1 2 2 2 1
输出样例:一组最优的 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

题目解析:

    在计算这个题目的次数时,我们可以用暴力法去求解,但是这意味着次数达到最高,因此我们采用差分法去求解这类问题。但是,为什么可以去用这种方法。

1.根据初始温度和目标温度,可以得到相差温度数组a,对于a数组,每个元素的含义为当前元素需要加多少次,才能到达目标温度(即操作次数)

2.我们需要消耗掉所有的操作,才能到达目标温度,即把a数组中的元素转化为0,而每次对于a数组上[l,r]区间内的元素+1,相当于在a数组的差分数组d上d[l]+=1, d[r+1]−=1,即一个数字+1,一个数字−1,特殊的,还可以对于一个数字+1或者−1(只修改一个数字),由此,问题转化为:在差分数组d上,每次进行+1、−1操作,能使得全部元素变为0的次数,那么就是差分数组中,正数和、负数绝对值和的最大值

3.输出max(|pos|,|neg|)

代码如下:

#include<stdio.h>
#define N 100010
int main()
{
    int n,a[N],b[N],c[N]={0},d[N]={0},min=0;
      scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);//目标数组
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);//初始数组
    for(int i=1;i<=n;i++) c[i]=a[i]-b[i];//目标数组与初始数组的差值数组
    for(int i=1;i<=n+1;i++)//求差分数组
      d[i]=c[i]-c[i-1];
      for(int i=1;i<=n+1;i++) if(d[i]>0)min+=d[i];//计算正数之和,即为最少次数
      printf("%d\n",min);
    return 0;
}
 

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值