当前位置: 首页 > article >正文

《攀爬者》

题目背景

HKE 考完 GDOI 之后跟他的神犇小伙伴们一起去爬山。

题目描述

他在地形图上标记了 NN 个点,每个点 PiPi​ 都有一个坐标 (xi,yi,zi)(xi​,yi​,zi​)。所有点对中,高度值 zz 不会相等。HKE 准备从最低的点爬到最高的点,他的攀爬满足以下条件:

(1) 经过他标记的每一个点;

(2) 从第二个点开始,他经过的每一个点高度 zz 都比上一个点高;

(3) HKE 会飞,他从一个点 PiPi​ 爬到 PjPj​ 的距离为两个点的欧几里得距离。即,(Xi−Xj)2+(Yi−Yj)2+(Zi−Zj)2(Xi​−Xj​)2+(Yi​−Yj​)2+(Zi​−Zj​)2​

现在,HKE 希望你能求出他攀爬的总距离。

输入格式

第一行,一个整数 NN 表示地图上的点数。

接下来 NN 行,三个整数 xi,yi,zixi​,yi​,zi​ 表示第 ii 个点的坐标。

输出格式

一个实数,表示 HKE 需要攀爬的总距离(保留三位小数)

输入输出样例

输入 #1复制

5
2 2 2
1 1 1
4 4 4
3 3 3
5 5 5

输出 #1复制

6.928

说明/提示

对于100%的数据,1≤N≤500001≤N≤50000,答案的范围在 double 范围内。

C语言代码实现:

EXAMPLE(1)(优化运行时间后)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 比较函数,用于 qsort 对二维数组按照第三列元素排序
int compare(const void *a, const void *b) {
    int *aa = (int *)a;
    int *bb = (int *)b;
    return aa[2] - bb[2];
}

int main(int argc, char *argv[]) {
    int a[1000][3];
    int n, i;
    double sum = 0, q;

    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
    }
    // 使用 qsort 对数组进行排序
    qsort(a, n, sizeof(int[3]), compare);

    for (i = 0; i < n - 1; i++) {
        q = sqrt(pow(a[i][0] - a[i + 1][0], 2) + pow(a[i][1] - a[i + 1][1], 2) + pow(a[i][2] - a[i + 1][2], 2));
        sum += q;
    }
    printf("%.3f", sum);
    return 0;
}

EXAMPLE(优化运行时间前)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])
 {
     int a[1000][3],b1,b2,b3,n,i,j,k;
     double sum=0,q;
     scanf("%d",&n);
     for(i=0;i<n;i++)
     {
         scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
         
      } 
      for(i=0;i<n;i++)
      {
          for(j=0;j<n-i-1;j++)
          {
              if(a[j][2]>a[j+1][2])
              {
              b1=a[j][0];
              b2=a[j][1];
              b3=a[j][2];
              a[j][0]=a[j+1][0];
              a[j][1]=a[j+1][1];
              a[j][2]=a[j+1][2];
              a[j+1][0]=b1;
              a[j+1][1]=b2;
              a[j+1][2]=b3;
                  
              }
          }
      }
      for(i=0;i<n-1;i++)
      {
          b1=a[i][0]-a[i+1][0];
          b1*=b1;
          b2=a[i][1]-a[i+1][1];
          b2*=b2;
          b3=a[i][2]-a[i+1][2];
          b3*=b3;    
          q=b1+b2+b3;
          q=sqrt(q);
          sum+=q; 
      }
      printf("%.3f",sum);
    return 0;
}


http://www.kler.cn/a/467596.html

相关文章:

  • 简单的spring boot tomcat版本升级
  • HTML5实现好看的博客网站、通用大作业网页模板源码
  • Unity性能优化总结
  • MySQL的三大日志
  • 凸包(convex hull)简述
  • edeg插件/扩展推荐:助力生活工作
  • 探讨面向未来的框架新技术:逻辑驱动和自适应框架的突破
  • k8s集群,CRI-Docker部署条件及方法
  • Spring Cloud微服务多模块架构:父子工程搭建实践
  • 提示词教程:零样本提示
  • ArkTs-@Builder引用传递问题
  • 【MongoDB详解】
  • 旧服务改造及微服务架构演进
  • 如何在不丢失数据的情况下从 IOS 14 回滚到 IOS 13
  • 现代光学基础6
  • ruckus R510升级到Unleashe后不能访问
  • 端到端性能体验稳定性优化常见方案
  • webpack01
  • Elasticsearch 文档批处理 混合处理 批量操作
  • (四)基于STM32通过Event Recoder实现时间测量功能
  • Android中创建ViewModel的几种方法
  • 体验谷歌最新Gemini 2.0 Flash原生多模态音视频对话桌面分享功能
  • 数据结构C语言描述7(图文结合)--哈希、哈希冲突、开放地址法、链地址法等实现
  • 阿里云效自动化部署 Docker镜像
  • 电子电气架构 --- 整车整车网络管理浅析
  • 时序数据库对比