编程题(度度熊回家最短距离)
一个数轴上共有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);
}
}
“`如果对你有帮助的话,给个赞呗
这个方法虽然土,没有人家几行代码来得少。但是心情很愉悦,因为我解决了问题。
其实我也只是代码小白。啊哈哈
有错误欢迎指正,我们交流交流
推荐阅读