显示器插座最短连线算法(蓝桥杯十六届C组编程题第二题)

样例输入:

2

0

1

2

3

样例输出:

4

代码如下:

#include <stdio.h>

long long calcuateMinLength(int xianshiqi\[\],int chazuo\[\],int n)
{
int i,j,temp;
for(int i=0;i < n - 1;i++){
for(int j=0;j < n-1-i;j++){
if(xianshiqij > xianshiqij+1){
temp = xianshiqij;
xianshiqij = xianshiqij + 1;
xianshiqij + 1 = temp;
}
}
}
for(int i=0;i < n-1;i++){
for(int j=0;j< n-1-i;j++){
if(chazuoj > chazuoj+1){
temp = chazuoj;
chazuoj = chazuoj + 1;
chazuoj + 1 = temp;
}
}
}
long long totalLength = 0;
for(int i=0;i< n ;i++){
int cha = chazuoi - xianshiqii;
if(cha < 0){
cha = -cha;
}
totalLength += cha;
}
return totalLength;
}
int main()
{
int n;
int dq50005;
int cz50005;
int k;
scanf("%d",&n);
for(k=0;k<n;k++){
scanf("%d",&dqk);
}
for(k=0;k<n;k++){
scanf("%d",&czk);
}
printf("%lld",calcuateMinLength(dq,cz,n));
return 0;
}

代码中的变量 含义 备注
xianshiqi[] 显示器数组 存放所有显示器的坐标位置
chazuo[] 插座数组 存放所有插座的坐标位置
n 数量 显示器和插座各有多少个
totalLength 总长度 最终答案,所有线的长度之和
cha 差值 两个坐标之间的距离

🧠 核心函数:calcuateMinLength

第一步:给显示器排队(冒泡排序)

目的:把所有显示器按照坐标从小到大排列。
原理:就像排队一样,相邻的两个人比大小。如果左边的人(xianshiqi[j])比右边的人(xianshiqi[j+1])大(也就是坐标更靠右),就让他们交换位置。
结果:这一通折腾下来,xianshiqi 数组里,坐标小的在最前面,坐标大的在最后面。

第二步:给插座排队(冒泡排序)

  • 目的:同理,把所有插座也按照坐标从小到大排列。

第三步:一一对应连线(贪心策略)

  • 核心逻辑:
    • 现在显示器排好队了,插座也排好队了。
    • 我们让第 1 个显示器连第 1 个插座,第 2 个显示器连第 2 个插座......以此类推。
    • 这就是所谓的"贪心算法 ":排序后一一对应,总距离最短。
  • 计算距离 :
    • chazuo[i] - xianshiqi[i]:算出两个坐标的差。
    • if(cha < 0) cha = -cha; :这一步是在求绝对值。因为线长不能是负数,比如插座在左边(坐标小),显示器在右边(坐标大),减出来是负数,我们要把它变成正数。
  • 累加 :把每一根线的长度都加到 **totalLength**里。

注意 :这里用了 long long 来存总长度。因为题目里说坐标最大是 109109 ,如果有 5 万个这样的数加起来,普通的 int 存不下(会溢出爆炸),必须用更大的 long long。

🏭 主函数:main

主函数负责"招兵买马"和"发号施令"。

  1. 定义大数组 :int dq[50005]; 和 int cz[50005]; 。题目说最多 50000个设备,这里开稍微大一点点,防止不够用。
  2. 输入数据 :
    • 先读 n。
    • 第一个 for 循环:把显示器的坐标一个个读进 dq 数组。
    • 第二个 for 循环:把插座的坐标一个个读进 cz 数组。
  3. 调用计算 :printf("%lld", calcuateMinLength(dq, cz, n));
    • 把装好数据的数组扔进刚才写的函数里。
    • 拿到返回的结果,用**%lld**格式打印出来。

📌 总结

这段代码虽然用的是最基础的冒泡排序(效率略低,但在 �=50000N=50000 时可能会稍微慢一点点,不过逻辑完全正确),但它的优点在于可读性极强。它完美地展示了"排序 + 贪心"的解题思路:

  1. 把乱的坐标理整齐(排序)。
  2. 按顺序一个个配对(贪心)。
  3. 算出距离加起来(累加)
相关推荐
PaperAccept11 分钟前
【研知有术论文发表】材料科学一区期刊,影响因子30+的纳米科技SCI,审稿严格但有效率
大数据·数据结构·科技·量子计算
hetao173383716 分钟前
2026-11-02 hetao1733837 的刷题记录
c++·算法
Geektec19 分钟前
IMU 选型完全指南:从硬件参数到算法融合的系统工程视角
算法·imu·陀螺仪·加速度计·元器件选型
CQU_JIAKE24 分钟前
11.2【A】
算法
Tairitsu_H25 分钟前
[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?
数据结构·c++·图论
Godspeed Zhao1 小时前
从零开始学AI21——决策树
算法·决策树·机器学习
开开心心就好1 小时前
网页图片批量下载工具,输入链接就保存
服务器·算法·leetcode·支持向量机·pdf·ocr·1024程序员节
wuminyu2 小时前
JVM执行引擎学习总结:热点字节码编译成本地机器码
java·linux·c语言·jvm·c++
Tairitsu_H2 小时前
[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?
数据结构·c++·图论·最小生成树
佳得动2 小时前
编译和链接的认识(C语言)
c语言·开发语言