解题思路:

先对画作价值升序排序,因为连续的 M 个元素按升序排列时,相邻平方差的绝对值之和最小。

利用数学裂项相消原理,升序排列的连续 M 个元素的相邻平方差和 = 区间最大值平方 - 区间最小值平方,无需逐一遍历求和,简化计算。


注意事项:用long long存储平方值和 L 值,避免 int 类型存储大数值(如 10⁵的平方 = 10¹⁰)时溢出。


参考代码:

#include<stdio.h>

#include<limits.h>


#include<stdlib.h>  

/*qsort()需要的头文件,c语言的包含在头文件的函数不用用户自定义。

c++里头文件包含sort()函数,两个都是快速排序,默认升序,解决超时问题的关键中的关键

*/

int cmp(const void *a, const void *b) {    

    return *(const int*)a - *(const int*)b;

}

int main(){    

    int N,M,i,j;    

    scanf("%d%d",&N,&M);        

     int arr[N];    

    for(i=0;i<N;i++){        

    scanf("%d",&arr[i]);   

    }      

    qsort(arr, N, sizeof(int), cmp);   

//数据比较大时一定要用long long   

    long long min_L = LLONG_MAX;    

    for(i=0;i<=N-M;i++){       

         int end = i + M - 1; 

//关键在于保证首尾相差M幅画的连续区间,   

        long long square_end = (long long)arr[end] * arr[end];       

         long long square_start = (long long)arr[i] * arr[i];       

         long long current_L = square_end - square_start;       

         if(current_L < min_L){            

        min_L = current_L;       

         }   

    }   

  if(M == 1) min_L = 0;   

  printf("%lld\n",min_L);      

 return 0;

}

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论