算法每日一题——第六天——干草堆(差分)
原题链接: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]);}
算法每日一题——第六天——干草堆(差分)相关推荐
- AcWing每日一题2041. 干草堆
AcWing每日一题2041. 干草堆 题目描述 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来. 开始时,共有 N 个空干草堆,编号 1∼N. 约翰给贝茜 ...
- 寒假每日一题 2 : 干草堆 java
干草堆 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来. 开始时,共有 N 个空干草堆,编号 1∼N. 约翰给贝茜下达了 K 个指令,每条指令的格式为 A ...
- 2022AcWing寒假算法每日一题之2058. 笨拙的手指
2022AcWing寒假算法每日一题之2058. 笨拙的手指 题目链接:AcWing2058. 笨拙的手指 思路: 1.数据范围为0-1e9,则输入的时候按照字符串输入 2.将二进制和三进制各位数上的 ...
- 【备战蓝桥】 算法·每日一题(详解+多解)-- day1
[备战蓝桥] 算法·每日一题(详解+多解)-- day1 ✨博主介绍 什么是蓝桥杯 第一题: 第二题 第三题 第四题 第五题 第六题 第七题
- 【备战蓝桥杯】 算法·每日一题(详解+多解)-- day11
[备战蓝桥杯] 算法·每日一题(详解+多解)-- day11 ✨博主介绍 前言 Dijkstra 算法 流程 网络延迟时间 解题思路 Bellman-Ford 算法 流程 K 站内最便宜的航班 解题思 ...
- acwing2041. 干草堆(差分数组)
题目描述: 原题链接 视频讲解 差分算法(前缀和的逆运算) 差法算法(差分与前缀和的下标都从1开始,避免出现越界) 算法思路:给l,r区间内加上x,则表示为在l的位置+x,在r+1的位置上-x,就可抵 ...
- 【Acwing寒假2023每日一题】4655. 重新排序 - 差分 + 排序不等式
4655. 重新排序 - AcWing题库 思路: 要让查询总和最大 也就是让查询区间交集部分的数最大 我们可以定义一个数组c记录每个位置被计算的次数 比如区间[1,3]和[2,5] 则c[1,2,2 ...
- 算法每日一题--分治算法(二)-李富贵要上岸985
题目:魔法石的诱惑 分析一 想要做出这个题,首先得知道:给定一个正整数n,怎么快速计算出n的阶乘尾部0的个数 这种题嘛,主要是找规律,找出规律来后就很简单了.ok,先想想,阶乘最后有0,如果一个偶数和 ...
- 剑指Offer66题之每日6题 - 第六天
原题链接: 第一题:整数中1出现的次数: 第二题:把数组排成最小的数: 第三题:丑数: 第四题:第一个只出现一次的字符位置: 第五题:数组中的逆序对: 第六题:两个链表的第一个公共结点: 第一题:整数 ...
最新文章
- 黄聪:《跟黄聪学WordPress插件开发》
- spring boot异常——java.net.BindException: Address already in use: bind
- linux sed命令替换目标字符串所在行整行为给定值
- python的for循环累加_在python中将6 for循环累计和矢量化
- js 控制 获取 dropdownlist的值
- js当中null和{}区别
- webpack ,require.ensure配合oclazyload 实现ng1模块懒加载
- 关于联想oem系统激活方法尝试
- 教学管理系统java_Java 实现简易教务管理系统的代码
- C语言实现洗牌发牌程序,用C语言实现的扑克牌洗牌程序
- Android 布局旋转 横屏竖屏
- 关于打开Excel显示受保护视图空白无内容的问题已解决
- java论文答辩老师会问什么,毕业论文答辩老师一般会问什么问题
- 一回生,二回熟,三回巧
- Linux下常用的编辑文件与保存命令
- matlab插值龙格实验,实验二 拉格朗日插值龙格现象
- web开发中,中文乱码问题汇总
- 天网和瑞星杀毒软件冲突,电脑出现假死机
- 2020年游戏建模师发展前景怎么样?值不值得入坑
- 什么是微波天线阵列及微波天线阵列类型