原题链接:2041. 干草堆 - AcWing题库

读完这道题大致可以把题分为两部分,第一部分需要统计每个干草堆所堆放的干草捆的数量,第二部分需要根据干草捆的数量对干草堆排序,输出排最中间的干草堆堆放的干草捆数量。

在统计干草捆数量时,我最开始使用的是暴力法直接统计(两层循环),时间复杂度为O(),执行最后的样例时超时了。所以这道题需要使用差分法来解决。

差分法

差分就是将数列的每一项分别与前一项做差

例如:

原序列:[ 2 , 4 ,  3 , 7 ,  6 , 8 ,  3 , 5 ]

差分序列:[ 2 , 2 , -1 , 4 , -1 , 2 , -5 , 2 , -5]

序列的第一个数与原序列相同(相当是第一个数减0)

差分序列比原序列多一个数(相当是0减去最后一个数)

性质:

(1)差分序列想要得到原序列,只需要 a[ i ] = a[ i ] + a[ i - 1 ]

(2)想原序列m位置到n位置的所有数加上x,只需在差分序列a[ m ] + x    a[ n + 1 ] - x

继续用上面的例子:

原序列:[ 2 , 4 ,  3 , 7 ,  6 , 8 ,  3 , 5 ]

差分序列:[ 2 , 2 , -1 , 4 , -1 , 2 , -5 , 2 , -5]

要使第三个数到第七个数全部加2,a[ 2 ] + 2 , a[ 7 ] - 2

差分序列变为:[ 2 , 2 , 1 , 4 , -1 , 2 , -5 , 0 , -5]

化为原序列 :[ 2 , 4 , 5 , 9 , 8 , 10 , 5 , 5 ]

优点(使用范围)

给你多个区间, 要使每个区间范围内的数都加x,如果全部拿循环完成,时间复杂度为   , 若使用差分法,复杂度变为O(n)

这道题的第二部分需要根据干草捆的数量对干草堆排序,输出排最中间的干草堆堆放的干草捆数量。如果使用冒泡排序的话,时间依旧会超,我直接使用的是qsort函数。

下面是完整代码:

#include<stdio.h>
int cmp_int(const void* x,const void* y)
{return *((int*)x)-*((int*)y);
}
int main()
{int n,k;int a,b;scanf("%d%d",&n,&k);int arr1[1000010]={0};for(int i=0;i<k;i++)//差分法{scanf("%d%d",&a,&b);arr1[a]++;arr1[b+1]--;}for(int i=2;i<n+1;i++)//将差分序列恢复为原序列{arr1[i]=arr1[i-1]+arr1[i];}qsort(arr1,n,sizeof(int),cmp_int);//直接使用qsort函数printf("%d",arr1[(n)/2]);}

算法每日一题——第六天——干草堆(差分)相关推荐

  1. AcWing每日一题2041. 干草堆

    AcWing每日一题2041. 干草堆 题目描述 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来. 开始时,共有 N 个空干草堆,编号 1∼N. 约翰给贝茜 ...

  2. 寒假每日一题 2 : 干草堆 java

    干草堆 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来. 开始时,共有 N 个空干草堆,编号 1∼N. 约翰给贝茜下达了 K 个指令,每条指令的格式为 A ...

  3. 2022AcWing寒假算法每日一题之2058. 笨拙的手指

    2022AcWing寒假算法每日一题之2058. 笨拙的手指 题目链接:AcWing2058. 笨拙的手指 思路: 1.数据范围为0-1e9,则输入的时候按照字符串输入 2.将二进制和三进制各位数上的 ...

  4. 【备战蓝桥】 算法·每日一题(详解+多解)-- day1

    [备战蓝桥] 算法·每日一题(详解+多解)-- day1 ✨博主介绍 什么是蓝桥杯 第一题: 第二题 第三题 第四题 第五题 第六题 第七题

  5. 【备战蓝桥杯】 算法·每日一题(详解+多解)-- day11

    [备战蓝桥杯] 算法·每日一题(详解+多解)-- day11 ✨博主介绍 前言 Dijkstra 算法 流程 网络延迟时间 解题思路 Bellman-Ford 算法 流程 K 站内最便宜的航班 解题思 ...

  6. acwing2041. 干草堆(差分数组)

    题目描述: 原题链接 视频讲解 差分算法(前缀和的逆运算) 差法算法(差分与前缀和的下标都从1开始,避免出现越界) 算法思路:给l,r区间内加上x,则表示为在l的位置+x,在r+1的位置上-x,就可抵 ...

  7. 【Acwing寒假2023每日一题】4655. 重新排序 - 差分 + 排序不等式

    4655. 重新排序 - AcWing题库 思路: 要让查询总和最大 也就是让查询区间交集部分的数最大 我们可以定义一个数组c记录每个位置被计算的次数 比如区间[1,3]和[2,5] 则c[1,2,2 ...

  8. 算法每日一题--分治算法(二)-李富贵要上岸985

    题目:魔法石的诱惑 分析一 想要做出这个题,首先得知道:给定一个正整数n,怎么快速计算出n的阶乘尾部0的个数 这种题嘛,主要是找规律,找出规律来后就很简单了.ok,先想想,阶乘最后有0,如果一个偶数和 ...

  9. 剑指Offer66题之每日6题 - 第六天

    原题链接: 第一题:整数中1出现的次数: 第二题:把数组排成最小的数: 第三题:丑数: 第四题:第一个只出现一次的字符位置: 第五题:数组中的逆序对: 第六题:两个链表的第一个公共结点: 第一题:整数 ...

最新文章

  1. 黄聪:《跟黄聪学WordPress插件开发》
  2. spring boot异常——java.net.BindException: Address already in use: bind
  3. linux sed命令替换目标字符串所在行整行为给定值
  4. python的for循环累加_在python中将6 for循环累计和矢量化
  5. js 控制 获取 dropdownlist的值
  6. js当中null和{}区别
  7. webpack ,require.ensure配合oclazyload 实现ng1模块懒加载
  8. 关于联想oem系统激活方法尝试
  9. 教学管理系统java_Java 实现简易教务管理系统的代码
  10. C语言实现洗牌发牌程序,用C语言实现的扑克牌洗牌程序
  11. Android 布局旋转 横屏竖屏
  12. 关于打开Excel显示受保护视图空白无内容的问题已解决
  13. java论文答辩老师会问什么,毕业论文答辩老师一般会问什么问题
  14. 一回生,二回熟,三回巧
  15. Linux下常用的编辑文件与保存命令
  16. matlab插值龙格实验,实验二 拉格朗日插值龙格现象
  17. web开发中,中文乱码问题汇总
  18. 天网和瑞星杀毒软件冲突,电脑出现假死机
  19. 2020年游戏建模师发展前景怎么样?值不值得入坑
  20. 什么是微波天线阵列及微波天线阵列类型

热门文章

  1. ajax资料收集-Ajax文章(教程和实例)---Ajax资源下载(源码和教程)---Ajax规范标准
  2. 详解互联网平台的资金系统方案 自建支付清结算系统优势明显
  3. 推荐学习法——思维导图
  4. 教师运用计算机技术的难点,浅谈运用电脑技术进行备课的几点优势
  5. ESP8266开发板+mysql数据库+DHT11
  6. SSH java 面试题
  7. 魔道电子——稳压二极管、瞬态抑制二极管
  8. U3D游戏开发工程师正确入行姿势指南
  9. css filter:inver属性灵活使用
  10. 第四周 放大电路的分析