欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

编程题(度度熊回家最短距离)

程序员文章站 2023-12-27 12:23:39
...

一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。
但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离?
输入描述:
输入一个正整数N, N <= 50。

接下来N个整数表示坐标,正数表示X轴的正方向,负数表示X轴的负方向。绝对值小于等于100

输出描述:
输出一个整数表示度度熊最少需要走的距离。

输入例子1:
4
1 4 -1 3

输出例子1:
4

刚开始看这个题目,没注意看好题,我以为是去掉最大的数值,看了好几遍觉题目描述不清楚,后来再认认真真的看了一遍,发现是自己理解错了。

1.先将1到n-2每个点,到相邻的两点之间的距离之和,放在arr_jj里面,arr_jj的个数为k,arr个数为n;二者数量!!关系是k=n-2;我们要去掉的就是距离最大那个点

2.在把arr_jj的值放在brr_jj里。复制一遍。直接用copyOf()方法,进行冒泡排序,其实简单点用sort()方法就可以升序

3.我们已经知道最大的值,用binarySearch()来索引出最大的值,在arr_jj里的位置;

position相当于n;当k为0时;n的值为1;位置关系就是n=k+1;
找出要去掉的最大点,接下来就好办了。
4.我们求出所有点的距离绝对值,在相加为S
5.再减去要去掉的那个点的两边距离brr_jj【0】
6.最后加上新增加的距离。下标为position-1与position+1的距离
于是就能出现结果了:

我没有规范设置输入的数组要求,也就是题目说的数组元素绝对值小于50;

package ceshi;

import java.util.Arrays;
import java.util.Scanner;

public class huijia {
       public huijia(int n){
           try {
           Scanner pen=new Scanner(System.in);
           int arr[]=new int[n];
           for(int i=0;i<n;i++){
               arr[i]=pen.nextInt();
           }//输入数字
           int arr_jj[]=new int[n-2];//起点和终点之间一共有n-2个点,每个元素装一个点与之相邻两个点的距离个数是:k=n-2

           int qian,hou,cap;

           for(int i=1,k=0;i<n-1;i++,k++){
              qian=arr[i]-arr[i-1];
              if(qian<=0){
                  cap=-qian;
                  qian=cap;
              }
              hou=arr[i+1]-arr[i];
              if(hou<=0){
                  cap=-hou;
                  hou=cap;
              }
              arr_jj[k]=qian+hou;

              System.out.println(qian+"+"+hou+"="+arr_jj[k]+"  是arr_jj中第"+k+"个       "+"这是arr中第"+i+"个点值");//这里的i=k+1的关系

           }//求每个点与之相邻的两个点的距离之和

           int brr_jj[];
           brr_jj=Arrays.copyOf(arr_jj, arr_jj.length);//复制arr_jj给brr_jj
           int big;
           for(int i=0;i<brr_jj.length-1;i++){
               for(int j=0;j<brr_jj.length-1-i;j++){
               if(brr_jj[j]<brr_jj[j+1]){
                   big=brr_jj[j+1];
                   brr_jj[j+1]=brr_jj[j];
                   brr_jj[j]=big;
               } 
               }               
           }//将距离之和进行冒泡排序,可以得出点与之相邻的两个点的距离之和的最大值,最大值是brr_jj[0];


           int position=Arrays.binarySearch(arr_jj, brr_jj[0])+1;//用brr的最大值索引出在arr_jj的位置为k,i=k+1;
           System.out.println("这是要去掉第"+position+"个点"+arr[position]);//arr_jj的最大值对应的点——的值(在arr的位置),这是要去掉的点。

            int S=0,ss;
            for(int x=0;x<n-1;x++){
             ss=arr[x+1]-arr[x];
             if(ss<0){
                 ss=-ss;//将两点之间的间距化为正数
             }
             S=S+ss;//将距离相加

            }
            int newS;
            newS=arr[position+1]-arr[position-1];
            if(newS<0){
                newS=-newS;
            }//去position点之后,就增加了新了一条路线。(position+1)与(position-1)
           System.out.print("最短距离为:");
           System.out.println(S-brr_jj[0]+newS);//距离就是:所有点之间的距离之和  - 最大距离之和 + 新增加的距离newS
           } catch (Exception e) {
            // TODO: handle exception
        }
       }
}

这是主函数:

package ceshi;

import java.util.Scanner;

public class main_class {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
       Scanner pen=new Scanner(System.in);
       int n;
       n=pen.nextInt();
       huijia huijia=new huijia(n);

    }
}

编程题(度度熊回家最短距离)

“`如果对你有帮助的话,给个赞呗

这个方法虽然土,没有人家几行代码来得少。但是心情很愉悦,因为我解决了问题。
其实我也只是代码小白。啊哈哈
有错误欢迎指正,我们交流交流

上一篇:

下一篇: