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

简介: 算法每日一题——第六天——干草堆(差分)


原题链接: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]);
}


相关文章
|
4月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
318 14
|
4月前
|
机器学习/深度学习 边缘计算 分布式计算
基于差分进化算法的微电网调度研究(Matlab代码实现)
基于差分进化算法的微电网调度研究(Matlab代码实现)
193 1
|
7月前
|
机器学习/深度学习 算法
基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法matlab仿真
本项目实现基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法的MATLAB仿真,对比SVM和GWO-SVM性能。算法结合差分进化(DE)与灰狼优化(GWO),优化SVM参数以提升复杂高维数据预测能力。核心流程包括DE生成新种群、GWO更新位置,迭代直至满足终止条件,选出最优参数组合。适用于分类、回归等任务,显著提高模型效率与准确性,运行环境为MATLAB 2022A。
|
10月前
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
830 2
|
人工智能 算法 JavaScript
【算法】前缀和与差分
算法学习——前缀和与差分(含一维和二维)
224 4
【算法】前缀和与差分
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
算法 C++
c++算法学习笔记 (5)前缀和+差分
c++算法学习笔记 (5)前缀和+差分
|
人工智能 移动开发 算法
算法基础:前缀和与差分
算法基础:前缀和与差分
201 1
算法基础:前缀和与差分
|
人工智能 算法 BI
【算法基础】基础算法(二)--(高精度、前缀和、差分)(下)
【算法基础】基础算法(二)--(高精度、前缀和、差分)(下)
|
存储 算法 索引
【算法基础】基础算法(二)--(高精度、前缀和、差分)(上)
【算法基础】基础算法(二)--(高精度、前缀和、差分)(上)

热门文章

最新文章